了解到要获得两个对象的哈希码,通常对它们各自的哈希码执行异或操作,我想检查Tuple如何处理Item1 == Item2的情况。这就是我在源代码中发现的:
internal static int CombineHashCodes(int h1, int h2) {
return (((h1 << 5) + h1) ^ h2);
}我认为这是为了避免对所有相同的对象使用相同的哈希码,因为x ^ x = 0。为什么是h1 << 5?为什么它是专门的5呢?难道只有1吗?请帮我理解一下。
发布于 2016-03-15 08:16:10
((h1 << 5) + h1)等同于h1 * 33,33是3 * 11。
Java在某些散列中使用31,因为它是素数,而h1 * 31是几乎相同的(h1 << 5) - h,但是在求和时没有额外的溢出。
发布于 2016-03-15 08:12:28
在这里发现了一些东西这里
阅读关于Shift-Add-XOR散列的一节。
发布于 2016-04-10 18:48:45
感谢@HansPassant向我指出以下问题,这最能解释我想知道的事情:
https://stackoverflow.com/questions/36005243
复制相似问题