元组的GetHashCode黑客攻击

时间:2016-03-15 07:46:08

标签: c# .net hashcode

知道要获得两个对象的哈希码,通常的做法是对各自的哈希码进行XOR,我想检查一下Tuple如何处理Item1 == Item2的情况。这是我在源代码中找到的:

internal static int CombineHashCodes(int h1, int h2) {
        return (((h1 << 5) + h1) ^ h2);
    }

我认为这是为了避免为所有相等的对象使用相同的哈希码,因为x ^ x = 0。为什么h1 << 5呢?有没有理由特意5?可能只是1吗?请帮助我理解这一点。

3 个答案:

答案 0 :(得分:5)

((h1 << 5) + h1)相当于h1 * 3333相当于3 * 11
Java在某些哈希中使用31,因为它的素数和h1 * 31(h1 << 5) - h几乎相同,但没有额外的溢出,这可能发生在总和的情况下。

答案 1 :(得分:2)

在这里找到了一些东西

http://www.eternallyconfuzzled.com/tuts/algorithms/jsw_tut_hashing.aspx

阅读 Shift-Add-XOR哈希

部分

答案 2 :(得分:0)

感谢@HansPassant指出我最好的解释我想知道的问题:

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