[英]What are the rules I should follow to ensure GetHashCode() method returns unique value for an object?
为确保GetHashCode()方法返回对象的唯一值,应遵循哪些规则?
例如:
你甚至不应该瞄准 GetHashCode()
返回的每个对象的唯一值。 这不是点 GetHashCode()
。
埃里克·利珀特(Eric Lippert)撰写了一篇很棒的有关哈希码的文章 ,您应该仔细阅读。 基本上,您希望最终得到的东西将始终为两个相等的对象返回相同的值(并且您需要计算出相等的含义),并且可能为两个非相等的对象返回不同的值。
我个人倾向于使用这样的实现:
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());
您不一定需要简单的哈希码,因为您还需要覆盖Equals进行比较。 通常,我要做的是将我知道的值在对象之间不同,将它们连接成字符串并返回该哈希值。
我认为您的答案在这里:请参阅Jon Skeet答案,这是一种相当可靠的计算方法。 时间证明:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.