可能的重复:
重写 System.Object.GetHashCode 的最佳算法是什么?
怎样才是 GetHashCode 方法的良好实现?我做了一些谷歌搜索,发现了一些好话(MSDN),但似乎逻辑只是操作存储为类中字段的两个数字。实现这个方法的实际逻辑有这么简单吗?
最低要求是任何给定值的哈希码都应该相同。所以,这个实现是有效的,但分布很糟糕:
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;
}
简单的随机生成器也使用了相同的方法,因为它可以很好地分散值。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)