可能重复:
What is the best algorithm for an overridden System.Object.GetHashCode?
什么构成了GetHashCode方法的良好实现?我做了一些googling,并找到了一些好行(MSDN),但是逻辑似乎只是操纵类中两个作为字段存储的数字。实现此方法的实际逻辑是否如此简单?
发布于 2010-05-22 23:10:27
最低要求是,对于任何给定的值,哈希代码应该是相同的。因此,这个实现可以工作,但是发行版很糟糕:
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;
}同样的方法也被用于简单的随机生成器中,因为它很好地分散了值。
https://stackoverflow.com/questions/2890040
复制相似问题