知道要获得两个对象的哈希码,通常的做法是对各自的哈希码进行XOR,我想检查一下Tuple如何处理Item1 == Item2
的情况。这是我在源代码中找到的:
internal static int CombineHashCodes(int h1, int h2) {
return (((h1 << 5) + h1) ^ h2);
}
我认为这是为了避免为所有相等的对象使用相同的哈希码,因为x ^ x = 0
。为什么h1 << 5
呢?有没有理由特意5
?可能只是1
吗?请帮助我理解这一点。
答案 0 :(得分:5)
((h1 << 5) + h1)
相当于h1 * 33
而33
相当于3 * 11
。
Java在某些哈希中使用31
,因为它的素数和h1 * 31
是(h1 << 5) - h
几乎相同,但没有额外的溢出,这可能发生在总和的情况下。
答案 1 :(得分:2)
在这里找到了一些东西
http://www.eternallyconfuzzled.com/tuts/algorithms/jsw_tut_hashing.aspx
阅读 Shift-Add-XOR哈希
部分答案 2 :(得分:0)
感谢@HansPassant指出我最好的解释我想知道的问题: