我应该遵循哪些规则来确保 GetHashCode() 方法返回对象的唯一值?
例如:
- 我应该包括一些私人成员进行计算吗?
- 我应该乘而不是求和吗?
- 我可以确定我正在为特定对象图生成唯一的哈希码吗?等等
我应该遵循哪些规则来确保 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;
}
需要注意的事项:
如果您的字段可以为空,则需要在计算哈希时检查它。例如:
hash = hash * 31 + (field2 == null ? 0 : field2.GetHashCode());
您不一定需要一个万无一失的哈希码,因为您还需要覆盖 Equals 进行比较。通常我所做的是将我知道的值在对象之间不同,将它们连接成一个字符串并返回它的哈希值。
我认为您的答案就在这里:请参阅 Jon Skeet 答案,通常是非常可靠的计算方法。时间证明:)