知道为了获得两个对象的哈希码,通常的做法是对它们各自的哈希码进行XOR,我想检查一下Tuple如何处理其中的情况Item1 == Item2.这是我在源代码中找到的:
internal static int CombineHashCodes(int h1, int h2) {
return (((h1 << 5) + h1) ^ h2);
}
Run Code Online (Sandbox Code Playgroud)
我假设这是为了避免为所有相等的对象使用相同的哈希码,因为x ^ x = 0.为什么h1 << 5呢?这有什么特别的原因5吗?可能只是1?请帮我理解.
((h1 << 5) + h1)相当于h1 * 33和33是3 * 11.
Java使用31一些哈希因为它是素数,h1 * 31就是(h1 << 5) - h其几乎是相同的,但没有可能在总和的情况下发生的额外溢出.