实现GetHashCode

Gur*_*epS 10 c#

可能重复:
重写的System.Object.GetHashCode的最佳算法是什么?

什么构成了GetHashCode方法的良好实现?我做了一些谷歌搜索,并找到了一些好线(MSDN),但似乎逻辑只是操纵存储为类中的字段的两个数字.这个方法实际逻辑是否这么简单?

Guf*_*ffa 34

最低要求是对于任何给定值,哈希码应该是相同的.所以,这个实现工作,但分布是可怕的:

public override int GetHashCode() {
  return 1;
}
Run Code Online (Sandbox Code Playgroud)

为了最好地工作,哈希码应该考虑对象中的所有相关数据,并在整数范围内尽可能均匀地分布.

可以在System.Drawing.Point结构中找到确实考虑所有成员但不能提供非常好的分发的实现.它使用XOR来组合成员中的位,这意味着X和Y相等的所有点都得到哈希码零:

public override int GetHashCode() {
  return this.X ^ this.Y;
}
Run Code Online (Sandbox Code Playgroud)

获得更好分布的一种方法是将成员乘以素数并添加下一个成员,并根据需要重复:

public override int GetHashCode() {
  return ((this.Value1 * 251) + this.Value2) * 251 + this.Value3;
}
Run Code Online (Sandbox Code Playgroud)

在简单的随机生成器中使用了相同的方法,因为它很好地分散了值.