繁体   English   中英

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

[英]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答案,这是一种相当可靠的计算方法。 时间证明:)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM