0

我应该遵循哪些规则来确保 GetHashCode() 方法返回对象的唯一值?

例如:

  • 我应该包括一些私人成员进行计算吗?
  • 我应该乘而不是求和吗?
  • 我可以确定我正在为特定对象图生成唯一的哈希码吗?等等
4

3 回答 3

6

您甚至不应该每个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());
    
于 2011-09-05T20:12:42.613 回答
1

您不一定需要一个万无一失的哈希码,因为您还需要覆盖 Equals 进行比较。通常我所做的是将我知道的值在对象之间不同,将它们连接成一个字符串并返回它的哈希值。

于 2011-09-05T20:13:39.613 回答
0

我认为您的答案就在这里:请参阅 Jon Skeet 答案,通常是非常可靠的计算方法。时间证明:)

覆盖 System.Object.GetHashCode 的最佳算法是什么?

于 2011-09-05T20:13:34.603 回答