Object.GetHashCode 方法
用作特定类型的哈希函数。GetHashCode 适合在哈希算法和数据结构(如哈希表)中使用。
**命名空间:**System
**程序集:**mscorlib(在 mscorlib.dll 中)
语法
声明
Public Overridable Function GetHashCode As Integer
用法
Dim instance As Object
Dim returnValue As Integer
returnValue = instance.GetHashCode
public virtual int GetHashCode ()
public:
virtual int GetHashCode ()
public int GetHashCode ()
public function GetHashCode () : int
返回值
当前 Object 的哈希代码。
备注
此方法可由派生类重写。值类必须重写此方法,以提供适合该类并且确保哈希表中有更好的分布的哈希函数。在哈希表中可以用作键的类也必须重写此方法,因为在哈希表中用作键的对象对于通过此方法生成类自己的哈希代码是必需的。但是,在构造 Hashtable 时,如果用作键的对象没有提供有用的 GetHashCode 实现,您可以提供另外一个基于 System.Collections.IHashCodeProvider 接口的哈希代码提供程序。
GetHashCode 的默认实现不保证唯一性或一致性,因此,不能在进行散列时用作唯一对象标识符。派生类必须用返回唯一哈希代码的实现重写 GetHashCode。为了获得最佳结果,哈希代码必须基于实例字段或属性(而非静态字段或属性)的值。
给实现者的说明 哈希函数用于快速生成一个与对象的值相对应的数字(哈希代码)。哈希函数通常是特定于每个 Type 的,而且,必须至少使用一个实例字段作为输入。 哈希函数必须具有以下特点:
如果两个类型相同的对象表示相同的值,则哈希函数必须为两个对象返回相同的常数值。
为了获得最佳性能,哈希函数必须为所有输入生成随机分布。
不论对该对象进行什么样的更改,哈希函数都必须返回完全相同的值。
例如,String 类提供的 GetHashCode 实现为唯一的字符串值返回唯一的哈希代码。因此,如果两个 String 对象表示相同的字符串值,则它们返回相同的哈希代码。另外,该方法使用字符串中的所有字符生成相当随机的分布式输出,即使当输入集中在某些范围内时(例如,许多用户可能有只包含低位 128 个 ASCII 字符的字符串,即使字符串可以包含 65,535 个 Unicode 字符中的任何字符)。 GetHashCode 对于对象的给定实例必须总是返回相同的值。对于 Object 的派生类,当且仅当此派生类将值相等定义为引用相等并且类型不是值类型时,GetHashCode 才可以委托给 Object.GetHashCode 实现。 在类上提供好的哈希函数可以显著影响将这些对象添加到哈希表的性能。在具有好的哈希函数实现的哈希表中,搜索元素所用的时间是固定的(例如 O(1) 操作)。而在具有不好的哈希函数实现的哈希表中,搜索性能取决于哈希表中的项数(例如 O(n) 操作,其中的 n 是哈希表中的项数)。哈希函数的计算成本也必须不高。 GetHashCode 的实现必须不会导致循环引用。例如,如果 ClassA.GetHashCode 调用 ClassB.GetHashCode,ClassB.GetHashCode 必须不直接或间接调用 ClassA.GetHashCode。 GetHashCode 的实现必须不引发异常。 重写 GetHashCode 的派生类还必须重写 Equals,以保证被视为相等的两个对象具有相同的哈希代码;否则,Hashtable 可能不会正常工作。
示例
在某些情况下,GetHashCode 的实现只返回整数值。下面的代码示例阐释了返回整数值的 GetHashCode 的实现。
using System;
public struct Int32 {
public int value;
//other methods...
public override int GetHashCode() {
return value;
}
}
using namespace System;
public value struct Int32
{
public:
int value;
//other methods...
virtual int GetHashCode() override
{
return value;
}
};
import System.*;
public class Int32
{
public int value;
//other methods...
public int GetHashCode()
{
return value;
} //GetHashCode
} //Int32
一个类型常具有多个可以参与生成哈希代码的数据字段。生成哈希代码的一种方法是使用 XOR (eXclusive OR) 运算合并这些字段,如下面的代码示例所示。
using System;
public struct Point {
public int x;
public int y;
//other methods
public override int GetHashCode() {
return x ^ y;
}
}
using namespace System;
public value struct Point
{
public:
int x;
int y;
//other methods
virtual int GetHashCode() override
{
return x ^ y;
}
};
下面的代码示例阐释了另一种情况:使用 XOR (eXclusive OR) 合并该类型的字段以生成哈希代码。注意,在该代码示例中,字段表示用户定义的类型,每个类型都实现 GetHashCode 和 Equals。
using System;
public class SomeType {
public override int GetHashCode() {
return 0;
}
}
public class AnotherType {
public override int GetHashCode() {
return 1;
}
}
public class LastType {
public override int GetHashCode() {
return 2;
}
}
public class MyClass {
SomeType a = new SomeType();
AnotherType b = new AnotherType();
LastType c = new LastType();
public override int GetHashCode () {
return a.GetHashCode() ^ b.GetHashCode() ^ c.GetHashCode();
}
}
using namespace System;
public ref class SomeType
{
public:
virtual int GetHashCode() override
{
return 0;
}
};
public ref class AnotherType
{
public:
virtual int GetHashCode() override
{
return 1;
}
};
public ref class LastType
{
public:
virtual int GetHashCode() override
{
return 2;
}
};
public ref class MyClass
{
private:
SomeType^ a;
AnotherType^ b;
LastType^ c;
public:
virtual int GetHashCode() override
{
return a->GetHashCode() ^ b->GetHashCode() ^ c->GetHashCode();
}
};
import System;
public class SomeType {
public override function GetHashCode(): int {
return 0;
}
}
public class AnotherType {
public override function GetHashCode(): int {
return 1;
}
}
public class LastType {
public override function GetHashCode(): int {
return 2;
}
}
public class MyClass {
var a: SomeType = new SomeType();
var b: AnotherType = new AnotherType();
var c: LastType = new LastType();
public override function GetHashCode () : int {
return a.GetHashCode() ^ b.GetHashCode() ^ c.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));
}
}
using namespace System;
public value struct Int64
{
public:
long value;
//other methods...
virtual int GetHashCode() override
{
return ((int)value ^ (int)(value >> 32));
}
};
import System;
public class Int64 {
var value : long;
//other methods...
public override function GetHashCode() : int {
return (int(value) ^ int(value >> 32));
}
function Int64(myValue : long) {
value = myValue;
}
}
平台
Windows 98、Windows 2000 SP4、Windows CE、Windows Millennium Edition、Windows Mobile for Pocket PC、Windows Mobile for Smartphone、Windows Server 2003、Windows XP Media Center Edition、Windows XP Professional x64 Edition、Windows XP SP2、Windows XP Starter Edition
.NET Framework 并不是对每个平台的所有版本都提供支持。有关受支持版本的列表,请参见系统要求。
版本信息
.NET Framework
受以下版本支持:2.0、1.1、1.0
.NET Compact Framework
受以下版本支持:2.0、1.0
请参见
参考
Object 类
Object 成员
System 命名空间
Hashtable