2010-05-22 101 views

回答

34

最低要求是對於任何給定的值,散列碼應該是相同的。所以,這個實現的作品,但分佈是可怕的:

public override int GetHashCode() { 
    return 1; 
} 

最好的工作,哈希碼應該考慮對象中的所有相關數據,並可以爲均勻分佈儘可能整數範圍內。

可以在System.Drawing.Point結構中找到確實考慮所有成員,但沒有提供非常好的分佈的實現。它使用XOR到位成員結合,這意味着其中X和Y是相等的所有點得到的哈希碼爲零:

public override int GetHashCode() { 
    return this.X^this.Y; 
} 

的一種方式,以獲得更好分佈由原乘一員號並添加的下一個成員,根據需要重複:

public override int GetHashCode() { 
    return ((this.Value1 * 251) + this.Value2) * 251 + this.Value3; 
} 

同樣的方法在簡單的隨機發生器被使用,因爲它散射值相當不錯。

+0

那裏有一些非常好的點。謝謝! – dotnetdev 2010-05-23 20:00:57