System.Object.GetHashCode 方法
方法描述
用作特定类型的哈希函数。
语法定义(C# System.Object.GetHashCode 方法 的用法)
public virtual int GetHashCode()
参数/返回值
参数值/返回值 | 参数类型/返回类型 | 参数描述/返回描述 |
---|---|---|
返回值 | 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 方法的返回值。 请注意,这仅适用于应用程序的当前执行,再次运行该应用程序时可能会返回另一个哈希代码。
为了获得最佳性能,哈希函数必须为所有输入生成随机分布。
例如,String 类提供的 GetHashCode 方法的实现为相同的字符串值返回相同的哈希代码。 因此,如果两个 String 对象表示相同的字符串值,则它们返回相同的哈希代码。 另外,该方法使用字符串中的所有字符生成相当随机的分布式输出,即使当输入集中在某些范围内时(例如,许多用户可能有只包含低位 128 个 ASCII 字符的字符串,即使字符串可以包含 65,535 个 Unicode 字符中的任何字符)。
对于 Object 的派生类,当且仅当此派生类将值相等性定义为引用相等并且类型不是值类型时,GetHashCode 方法才可以委托给 Object.GetHashCode 实现。
在类上提供好的哈希函数可以显著影响将这些对象添加到哈希表的性能。 在具有好的哈希函数实现的哈希表中,搜索元素所用的时间是固定的(例如运算复杂度为 O(1) 的运算)。 而在具有不好的哈希函数实现的哈希表中,搜索性能取决于哈希表中的项数(例如运算复杂度为 O(n) 的运算,其中的 n 是哈希表中的项数)。 哈希函数的计算成本也必须不高。
GetHashCode 方法的实现必须不会导致循环引用。 例如,如果 ClassA.GetHashCode 调用 ClassB.GetHashCode,ClassB.GetHashCode 必须不直接或间接调用 ClassA.GetHashCode。
GetHashCode 方法的实现必须不引发异常。
重写 GetHashCode 的派生类还必须重写 Equals,以保证被视为相等的两个对象具有相同的哈希代码;否则,Hashtable 类型可能无法正常工作。
System.Object.GetHashCode 方法例子
如果派生类的数据成员比 Int32 大,则可以使用 XOR (eXclusive OR) 运算合并该值的高序位和低序位,如下面的代码示例所示。
using System; public struct Int64 { public long value; //other methods... public override int GetHashCode() { return ((int)value ^ (int)(value >> 32)); } }
版本信息
.NET Framework 受以下版本支持:4、3.5、3.0、2.0、1.1、1.0 .NET Framework Client Profile 受以下版本支持:4、3.5 SP1 受以下版本支持:
适用平台
Windows 7, Windows Vista SP1 或更高版本, Windows XP SP3, Windows XP SP2 x64 Edition, Windows Server 2008(不支持服务器核心), Windows Server 2008 R2(支持 SP1 或更高版本的服务器核心), Windows Server 2003 SP2 .NET Framework 并不是对每个平台的所有版本都提供支持。有关支持的版本的列表,请参见.NET Framework 系统要求。