GetHashCode()方法(C#)

我写了一个类,用它来模拟点(Point)结构,但是里面有个GetHashCode()在自定义equals方法之后必须写,那么这个GetHashCode()到底该怎么写呢?事实上我直接在里面写一句return 0;应该也不会出错吧,但是哈希码要保证唯一,那么这里面该怎么实现呢?如果可以,能不能解说一下Point结构是怎么实现这个方法的?谢谢!

Object..::.GetHashCode 方法

更新:2007 年 11 月

用作特定类型的哈希函数。

命名空间: System
程序集: mscorlib(在 mscorlib.dll 中)
语法
Visual Basic(声明)
Public Overridable Function GetHashCode As Integer
Visual Basic (用法)
Dim instance As Object
Dim returnValue As Integer

returnValue = instance.GetHashCode()
C#
public virtual int GetHashCode()
Visual C++
public:
virtual int GetHashCode()
J#
public int GetHashCode()
JScript
public function GetHashCode() : int

返回值
类型:System..::.Int32
当前 Object 的哈希代码。
备注
GetHashCode 方法适用于哈希算法和诸如哈希表之类的数据结构。

GetHashCode 方法的默认实现不保证针对不同的对象返回唯一值。而且,.NET Framework 不保证 GetHashCode 方法的默认实现以及它所返回的值在不同版本的 .NET Framework 中是相同的。因此,在进行哈希运算时,该方法的默认实现不得用作唯一对象标识符。

GetHashCode 方法可以由派生类型重写。值类型必须重写此方法,以提供适合该类型的哈希函数和在哈希表中提供有用的分布。为了获得最佳结果,哈希代码必须基于实例字段或属性(而非静态字段或属性)的值。

用作 Hashtable 对象中键的对象还必须重写 GetHashCode 方法,因为这些对象必须生成其各自的哈希代码。如果用作键的对象不提供 GetHashCode 的有用实现,您可以在构造 Hashtable 对象时指定哈希代码提供程序。在 .NET Framework 2.0 版之前,哈希代码提供程序是基于 System.Collections..::.IHashCodeProvider 接口的。从 2.0 版开始,哈希代码提供程序基于 System.Collections..::.IEqualityComparer 接口。

对实现者的说明:
哈希函数用于快速生成一个与对象的值相对应的数字(哈希代码)。哈希函数通常是特定于每个 Type 的,而且,必须至少使用一个实例字段作为输入。

哈希函数必须具有以下特点:

如果两个对象的比较结果相等,则每个对象的 GetHashCode 方法都必须返回同一个值。但是,如果两个对象的比较结果不相等,则这两个对象的 GetHashCode 方法不一定返回不同的值。

一个对象的 GetHashCode 方法必须总是返回同一个哈希代码,但前提是没有修改过对象状态,对象状态用来确定对象的 Equals 方法的返回值。请注意,这仅适用于应用程序的当前执行,再次运行该应用程序时可能会返回另一个哈希代码。

为了获得最佳性能,哈希函数必须为所有输入生成随机分布。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-04-07
equals方法原来的判断的依据就是GetHashCode方法得来的hashcode 你重写了equals方法暂时是没什么问题
哈希算法 核心中的核心就是要保证唯一性 实际算法方案有多种 可以用当前线程的ID乘以一个固定的数 得到一个数作为哈希码返回也可以返回直接base.GetHashCode

hashcode跟你类本身是抽象的什么没什么关系