关于c#:实现GetHashCode


Implementing GetHashCode

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
What is the best algorithm for an overridden System.Object.GetHashCode?

什么是GetHashCode方法的良好实现?我在谷歌上搜索了一下,找到了一些goodlines(msdn),但逻辑似乎只处理了类中作为字段存储的两个数字。实现这个方法的实际逻辑是否如此简单?


最低要求是对于任何给定的值,哈希代码都应该相同。所以,这个实现是可行的,但是分发是可怕的:

1
2
3
public override int GetHashCode() {
  return 1;
}

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

可以在system.drawing.point结构中找到一个考虑了所有成员但没有给出非常好分布的实现。它使用xor组合成员中的位,这意味着x和y相等的所有点都得到散列码零:

1
2
3
public override int GetHashCode() {
  return this.X ^ this.Y;
}

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

1
2
3
public override int GetHashCode() {
  return ((this.Value1 * 251) + this.Value2) * 251 + this.Value3;
}

同样的方法也用于简单的随机生成器,因为它可以很好地分散值。