人们能否推荐快速简单的方法来组合两个对象的哈希码。我没有太担心冲突,因为我有一个哈希表,该表可以有效地处理该问题,我只希望某些东西能够尽快生成代码。
围绕SO和Web进行阅读似乎有一些主要的候选人:
人们会推荐什么,为什么?
我个人会避免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,没有人真正知道它为什么运作良好,但确实如此。它也很容易记住,易于实现,并且易于扩展到任意多个字段。