Object.GetHashCode 方法

定义

用作默认哈希函数。

public:
 virtual int GetHashCode();
public virtual int GetHashCode();
abstract member GetHashCode : unit -> int
override this.GetHashCode : unit -> int
Public Overridable Function GetHashCode () As Integer

返回

当前对象的哈希代码。

注解

有关此 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 类型可能无法正常工作。

适用于

另请参阅