为了确保GetHashCode()方法为对象返回唯一值,我应该遵循哪些规则?
例如:
答案 0 :(得分:6)
你不应该瞄准 GetHashCode()
为每个对象返回一个唯一值。这不是GetHashCode()
的点。
Eric Lippert有great post about hash codes你应该仔细阅读。基本上你想要得到的东西总是会为两个相等的对象返回相同的值(你需要找出你的意思相等)并且可能到为两个不相等的对象返回不同的值。
我个人倾向于使用这样的实现:
public override int GetHashCode()
{
int hash = 17;
hash = hash * 31 + field1.GetHashCode();
hash = hash * 31 + field2.GetHashCode();
hash = hash * 31 + field3.GetHashCode();
...
return hash;
}
需要注意的事项:
如果您的字段可以为null,则需要在计算哈希值时检查该字段。例如:
hash = hash * 31 + (field2 == null ? 0 : field2.GetHashCode());
答案 1 :(得分:1)
您不一定需要一个简单的哈希代码,因为您还需要覆盖Equals进行比较。通常我所做的就是将我知道的值与对象进行不同的连接,将它们连接成一个字符串并返回哈希值。
答案 2 :(得分:0)
我认为你的答案就在这里:见Jon Skeet的答案,通常是非常可靠的计算方法。经时间证明:)
What is the best algorithm for an overridden System.Object.GetHashCode?