元组的 GetHashCode hack
Tuple's GetHashCode hack
知道要获取两个对象的哈希码,通常的做法是对它们各自的哈希码进行异或,我想检查元组如何处理 Item1 == Item2
的情况。这是我在源代码中找到的:
internal static int CombineHashCodes(int h1, int h2) {
return (((h1 << 5) + h1) ^ h2);
}
我假设这是为了避免对所有相同的对象使用相同的哈希码,因为 x ^ x = 0
。为什么 h1 << 5
呢?为什么它特别是 5
是有原因的?难道只是1
?请帮助我理解这一点。
在这里找到了一些东西here
阅读有关 Shift-Add-XOR 哈希的部分
((h1 << 5) + h1)
等同于h1 * 33
,33
等同于3 * 11
。
Java 在某些哈希中使用 31
,因为它是质数,而 h1 * 31
是 (h1 << 5) - h
,这几乎相同,但没有额外的溢出,这在求和的情况下可能会发生。
感谢@HansPassant 向我指出以下最能解释我想知道的问题的问题:
Why are 5381 and 33 so important in the djb2 algorithm?
知道要获取两个对象的哈希码,通常的做法是对它们各自的哈希码进行异或,我想检查元组如何处理 Item1 == Item2
的情况。这是我在源代码中找到的:
internal static int CombineHashCodes(int h1, int h2) {
return (((h1 << 5) + h1) ^ h2);
}
我假设这是为了避免对所有相同的对象使用相同的哈希码,因为 x ^ x = 0
。为什么 h1 << 5
呢?为什么它特别是 5
是有原因的?难道只是1
?请帮助我理解这一点。
在这里找到了一些东西here
阅读有关 Shift-Add-XOR 哈希的部分
((h1 << 5) + h1)
等同于h1 * 33
,33
等同于3 * 11
。
Java 在某些哈希中使用 31
,因为它是质数,而 h1 * 31
是 (h1 << 5) - h
,这几乎相同,但没有额外的溢出,这在求和的情况下可能会发生。
感谢@HansPassant 向我指出以下最能解释我想知道的问题的问题:
Why are 5381 and 33 so important in the djb2 algorithm?