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

本文关键字:返回 方法 对象 唯一 GetHashCode 规则 确保 我应该 | 更新日期: 2023-09-27 18:07:45

我应该遵循什么规则来确保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的答案,一般比较可靠的计算方法。时间证明:)

重写System.Object.GetHashCode的最佳算法是什么?