知道要獲得兩個對象的散列碼,通常會對其各自的散列碼進行異或運算。我想檢查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