Object.GetHashCode 方法

定义

作为默认哈希函数。

C#
public virtual int GetHashCode();

返回

当前对象的哈希代码。

注解

有关此 API 的详细信息,请参阅 Object.GetHashCode 的补充 API 备注

继承者说明

哈希函数用于快速生成与 对象值相对应的数字 (哈希代码) 。 哈希函数通常特定于每个类型,并且为了唯一性,必须使用至少一个实例字段作为输入。 不应使用静态字段的值来计算哈希代码。

对于派生自 Object的类,仅当派生类GetHashCode()将相等性定义为引用相等性时, GetHashCode 方法才能委托给基类实现。 引用类型的默认 GetHashCode() 实现将返回与 方法返回 GetHashCode(Object) 的哈希代码等效的哈希代码。 可以为不可变引用类型重写 GetHashCode() 。 通常,对于可变引用类型,仅当以下情况下才应重写 GetHashCode()

  • 可以从不可变的字段计算哈希代码;或

  • 可以确保可变对象的哈希代码不会更改,而该对象包含在依赖于其哈希代码的集合中。

否则,你可能会认为可变对象在哈希表中丢失。 如果选择替代 GetHashCode() 可变引用类型,文档应明确指出,当对象存储在哈希表中时,该类型的用户不应修改对象值。

对于值类型, GetHashCode() 提供使用反射的默认哈希代码实现。 应考虑重写它以提高性能。

有关以各种方式计算哈希代码的详细信息和示例,请参阅示例部分。

哈希函数必须具有以下属性:

  • 如果两个 对象比较相等,则 GetHashCode() 每个对象的 方法必须返回相同的值。 但是,如果两个对象不相等,则 GetHashCode() 两个对象的方法不必返回不同的值。

  • GetHashCode()对象的 方法必须一致地返回相同的哈希代码,只要对象状态确定对象的 System.Object.Equals 方法的返回值没有修改。 请注意,这仅适用于应用程序的当前执行,如果再次运行应用程序,则可以返回不同的哈希代码。

  • 为了获得最佳性能,哈希函数应为所有输入(包括大量聚集的输入)生成均匀分布。 这意味着,对对象状态的少量修改应导致对生成的哈希代码进行大量修改,以获得最佳哈希表性能。

  • 哈希函数的计算成本应该较低。

  • 方法 GetHashCode() 不应引发异常。

例如,类提供的 String 方法的GetHashCode()实现为相同的字符串值返回相同的哈希代码。 因此,如果两个 String 对象表示相同的字符串值,则返回相同的哈希代码。 此外, 方法使用字符串中的所有字符生成合理的随机分布输出,即使输入聚集在某些范围 (例如,许多用户的字符串可能只包含较低的 128 个 ASCII 字符,即使字符串可以包含) 的 65,535 个 Unicode 字符中的任何一个。

在类上提供良好的哈希函数可能会显著影响将这些对象添加到哈希表的性能。 在具有提供哈希函数良好实现的键的哈希表中,搜索元素需要恒定的时间 (例如,O (1) 操作) 。 在哈希函数实现不佳的哈希表中,搜索的性能取决于哈希表中的项数 (例如,O (n) 操作,其中 n 是哈希表中) 项数。 在以下情况下,恶意用户可以输入增加冲突数量的数据,这可能会显著降低依赖于哈希表的应用程序的性能:

  • 当哈希函数产生频繁的冲突时。

  • 当哈希表中很大比例的对象生成彼此相等或近似的哈希代码时。

  • 当用户输入从中计算哈希代码的数据时。

重写 GetHashCode() 的派生类还必须重写 Equals(Object) ,以确保两个被视为相等的对象具有相同的哈希代码;否则, Hashtable 该类型可能无法正常工作。

适用于

产品 版本
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

另请参阅