知道要获得两个对象的哈希码,通常的做法是对它们各自的哈希码进行 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 并且 333 * 11
Java 在某些哈希中使用 31,因为它是素数,而 h1 * 31(h1 << 5) - h,这几乎相同,但没有在求和的情况下可能发生的额外溢出。

关于c# - Tuple 的 GetHashCode 黑客,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36005243/

10-11 22:27