实现 GetHashCode [重复]

Posted

技术标签:

【中文标题】实现 GetHashCode [重复]【英文标题】:Implementing GetHashCode [duplicate] 【发布时间】:2011-02-22 19:40:12 【问题描述】:

可能重复:What is the best algorithm for an overridden System.Object.GetHashCode?

什么是 GetHashCode 方法的良好实现?我做了一些谷歌搜索,发现了一些优点(MSDN),但似乎逻辑只是操纵存储为类中字段的两个数字。实现这个方法的实际逻辑这么简单吗?

【问题讨论】:

【参考方案1】:

最低要求是任何给定值的哈希码都应该相同。所以,这个实现是可行的,但是分布很糟糕:

public override int GetHashCode() 
  return 1;

为了达到最佳效果,哈希码应考虑对象中的所有相关数据,并在整数范围内尽可能均匀分布。

可以在 System.Drawing.Point 结构中找到一个考虑所有成员但没有给出很好分布的实现。它使用 XOR 组合成员中的位,这意味着 X 和 Y 相等的所有点的哈希码为零:

public override int GetHashCode() 
  return this.X ^ this.Y;

获得更好分布的一种方法是将一个成员乘以一个素数并添加下一个成员,根据需要重复:

public override int GetHashCode() 
  return ((this.Value1 * 251) + this.Value2) * 251 + this.Value3;

在简单的随机生成器中使用了相同的方法,因为它很好地分散了值。

【讨论】:

那里有一些非常好的观点。谢谢!

以上是关于实现 GetHashCode [重复]的主要内容,如果未能解决你的问题,请参考以下文章

覆盖 GetHashCode [重复]

在 C# 中实现 Equals 但不是 GetHashCode [重复]

Distinct去除集合中的重复项GetHashCode方法没有返回obj.GetHashCode()导致出错

自定义类型 GetHashCode [重复]

如何在对象上实现 GetHashCode()? [复制]

C#GetHashCode() 高性能散列算法 [重复]