知道要获得两个对象的散列码,通常会对其各自的散列码进行异或运算。我想检查Tuple如何处理Item1 == Item2
的情况。这是我在源代码中发现:Tuple's GetHashCode hack
internal static int CombineHashCodes(int h1, int h2) {
return (((h1 << 5) + h1)^h2);
}
我认为这是为了避免所有相等的对象相同的hashCode,因为x^x = 0
。为什么h1 << 5
虽然?有没有一个原因,它是专门为5
?难道只是1
?请帮助我理解这一点。
很多方法来写一个散列函数,它比普通的XOR更好,还是非常快的。这是伯恩斯坦的散列,又名djb2,减去种子。乘以33并不是任意的,在[this Q + A]中进行了说明(http://stackoverflow.com/questions/1579721/why-are-5381-and-33-so-important-in-the-djb2-algorithm) 。 –
@HansPassant这是迄今为止我的问题的最佳答案,谢谢! – DevNewb