实现GetHashCode
可能重复:
什么是重写的System.Object.GetHashCode的最佳算法?
什么构成GetHashCode方法的良好实现? 我做了一些Google搜索,并找到了一些goodlines(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;
}
简单的随机生成器中使用了相同的方法,因为它可以很好地分散值。
链接地址: http://www.djcxy.com/p/39753.html