一尘不染

快速简单的哈希码组合

c#

人们能否推荐快速简单的方法来组合两个对象的哈希码。我没有太担心冲突,因为我有一个哈希表,该表可以有效地处理该问题,我只希望某些东西能够尽快生成代码。

围绕SO和Web进行阅读似乎有一些主要的候选人:

  1. 异或
  2. 使用素数乘法进行异或
  3. 简单的数字运算,例如乘法/除法(带有溢出检查或环绕)
  4. 生成一个String,然后使用String类的Hash Code方法

人们会推荐什么,为什么?


阅读 135

收藏
2020-05-19

共1个答案

一尘不染

我个人会避免XOR-这意味着任何两个相等的值都将导致0-因此hash(1,1)== hash(2,2)== hash(3,3)等。另外hash(5,0)
== hash(0,5)等可能偶尔出现。我 已经 刻意用它集合散列-如果你想哈希项目的顺序,你 关心的排序,这是不错的。

我通常使用:

unchecked
{
    int hash = 17;
    hash = hash * 31 + firstField.GetHashCode();
    hash = hash * 31 + secondField.GetHashCode();
    return hash;
}

这就是Josh Bloch在Effective Java中建议的形式。上次回答类似的问题时,我设法找到了一篇文章进行了详细讨论-
IIRC,没有人真正知道它为什么运作良好,但确实如此。它也很容易记住,易于实现,并且易于扩展到任意多个字段。

2020-05-19