知道要获得两个对象的哈希码,通常的做法是对它们各自的哈希码进行 XOR,我想检查 Tuple 如何处理 Item1 == Item2
的情况。这是我在源代码中发现的:
internal static int CombineHashCodes(int h1, int h2) {
return (((h1 << 5) + h1) ^ h2);
}
我认为这是为了避免对所有相等的对象使用相同的哈希码,因为
x ^ x = 0
。为什么是 h1 << 5
呢?有没有理由说明它特别是 5
?可能只是 1
吗?请帮助我理解这一点。 最佳答案
((h1 << 5) + h1)
等价于 h1 * 33
并且 33
是 3 * 11
。
Java 在某些哈希中使用 31
,因为它是素数,而 h1 * 31
是 (h1 << 5) - h
,这几乎相同,但没有在求和的情况下可能发生的额外溢出。
关于c# - Tuple 的 GetHashCode 黑客,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36005243/