2010-05-22 100 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