元组的GetHashCode黑客攻击

Dev*_*ewb 4 .net c# hashcode

知道为了获得两个对象的哈希码,通常的做法是对它们各自的哈希码进行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?请帮我理解.

Val*_*rov 5

((h1 << 5) + h1)相当于h1 * 33333 * 11.
Java使用31一些哈希因为它是素数,h1 * 31就是(h1 << 5) - h其几乎是相同的,但没有可能在总和的情况下发生的额外溢出.

  • @taffer 这意味着再次添加`h1`后,它变成`* 33`或者减去它后变成`* 31`。 (2认同)