元组的 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 * 3333等同于3 * 11
Java 在某些哈希中使用 31,因为它是质数,而 h1 * 31(h1 << 5) - h,这几乎相同,但没有额外的溢出,这在求和的情况下可能会发生。

感谢@HansPassant 向我指出以下最能解释我想知道的问题的问题:

Why are 5381 and 33 so important in the djb2 algorithm?