何时重写GetHashCode()方法?

19

什么时候应该重写在 'System' 命名空间中的 'Object' 类提供的 'GetHashCode()' 方法?

4个回答

14

当你重写 Equals 时,基本上是想要提供与简单的引用相等性不同的相等性理念。

字符串是一个很好的例子 - 如果两个字符串表示相同的字符序列,则它们在简单调用Equals时相等。哈希码反映了这一点,因此如果两个字符串相等,则它们将具有相同的哈希码。(反之则不一定成立 - 两个不相等的字符串可能会有相同的哈希码,但这种情况不太可能发生。)

(顺便说一句,字符串在其他方面也很棘手 - 基于文化和大小写,有许多不同的相等性理念,但是String.Equals只查看组成字符串的UTF-16代码点,并以最简单的方式进行比较。)


我和我的同事今天刚讨论过这个问题。现在感觉更有意义了。谢谢Jon。 - RSolberg
假设我有一个点,其中包含两个整数来描述坐标。如何返回一个仅为一个整数的唯一哈希码?我的结构体拥有更多数据,就越有可能为完全不同的数据获取相同的哈希值——如果我有7个浮点数作为其中一个结构体的成员(该结构体具有相等操作),那么实现这个功能是否无用? - Ray
@PacMani:为什么需要返回一个唯一的哈希码? - Jon Skeet
@JonSkeet:哦,我以为它用于几乎唯一的东西。那么它是用来做什么的? - Ray

4

如果您的类型应该遵循值语义(比较内容)而不是引用语义(比较对象标识),则应编写自己的覆盖实例object.Equals()方法。


3

如果你重写 Equals 方法,那么你必须同时重写 GetHashCode 方法。


1
“GetHashCode” 方法可以被派生类型重写。值类型必须重写此方法,以提供适用于该类型的哈希函数,并在哈希表中提供有用的分布。为了获得最佳结果,哈希码必须基于实例字段或属性的值,而不是静态字段或属性。
在 Hashtable 对象中用作键的对象也必须重写 GetHashCode 方法,因为这些对象必须生成自己的哈希码。如果用作键的对象没有提供有用的 GetHashCode 实现,则可以在构造 Hashtable 对象时指定哈希码提供程序。在 .NET Framework 版本 2.0 之前,哈希码提供程序基于 System.Collections.IHashCodeProvider 接口。从版本 2.0 开始,哈希码提供程序基于 System.Collections.IEqualityComparer 接口。”

http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接