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; } |
同样的方法也用于简单的随机生成器,因为它可以很好地分散值。