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

时间:2011-09-05 20:10:56

标签: c# .net gethashcode

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

例如:

  • 我应该包括一些prive成员进行计算吗?
  • 我应该乘以而不是总和吗?
  • 我可以确定我是否为特定对象图生成了一个uniqe哈希码?等

3 个答案:

答案 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?