GetHashCode();

Happyboy_zjy 2002-03-14 02:13:38
GetHashCode(从 Attribute 继承) 已重写。返回该实例的哈希代码

哪位大侠能解释一下到底什么东西是哈希代码? 这个值有什么用?一般用在那?
为什么好象很多类都有这个方法呢?
...全文
333 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhq2000 2002-03-14
  • 打赏
  • 举报
回复
用作特定类型的哈希函数,适合在哈希算法和数据结构(如哈希表)中使用。

[Visual Basic]
<Serializable>
<ClassInterface(ClassInterfaceType.AutoDual)>
Overridable Public Function GetHashCode() As Integer
[C#]
[Serializable]
[ClassInterface(ClassInterfaceType.AutoDual)]
public virtual int GetHashCode();
[C++]
[Serializable]
[ClassInterface(ClassInterfaceType.AutoDual)]
public: virtual int GetHashCode();
[JScript]
public
Serializable
ClassInterface(ClassInterfaceType.AutoDual)
function GetHashCode() : int;
返回值
当前 Object 的哈希代码。

备注
此方法可由派生类重写。值类必须重写此方法,以提供适合该类并且确保哈希表中有更好的分布的哈希函数。在哈希表中可以用作键的类也必须重写此方法,因为在哈希表中用作键的对象对于通过此方法生成类自己的哈希代码是必需的。

Object.GetHashCode 的此实现只能保证将为相同的实例返回相同的哈希代码;它无法保证不同的实例将具有不同的哈希代码,或者两个引用相同值的对象将具有相同的哈希代码。.NET 框架的不同版本对于相同的实例也可能会生成不同的哈希代码。因此,不要将哈希代码保持到文件或通过网络发送它们。若要保证相同的对象具有相同的哈希代码,必须使用 System.Collections.IHashCodeProvider 接口定义您自己的不可变的哈希函数并且始终使用它。

默认实现返回由公共语言运行库确定的对象的索引。该索引对于执行引擎实例的 AppDomain 中的对象实例而言是唯一的。但是,由于在垃圾回收过程中回收了对象后可以重用该索引,所以对于两个不同的对象可能获得相同的哈希代码。另外,两个表示相同值的对象只有是完全相同的对象时,它们才具有相同的哈希代码。此实现对哈希运算并不是特别有用;因此,派生类应重写 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 可能不会正常工作。

示例
[C#, JScript] 在某些情况下,GetHashCode 的实现只返回整数值。下列代码示例阐释了返回整数值的 GetHashCode 的实现。

[C#]
using System;

public struct Int32 {
public int value;

//other methods...

public override int GetHashCode() {
return value;
}
}
[C#, JScript] 一个类型常具有多个可以参与生成哈希代码的数据字段。生成哈希代码的一种方法是使用 XOR (eXclusive OR) 运算合并这些字段,如下列代码示例所示。

[C#]
using System;

public struct Point {
public int x;
public int y;

//other methods

public override int GetHashCode() {
return x ^ y;
}
}
[C#, JScript] 下列代码示例阐释了另一种情况:使用 XOR (eXclusive OR) 合并该类型的字段以生成哈希代码。注意,在该代码示例中,字段表示用户定义的类型,每个类型都实现 GetHashCode 和 Equals。

[C#]
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();
}
}
[JScript]
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();
}
}
[C#, JScript] 如果派生类的数据成员比 Int32 大,则可以使用 XOR (eXclusive OR) 运算合并该值的高序位和低序位,如下列代码示例所示。

[C#]
using System;

public struct Int64 {
public long value;

//other methods...

public override int GetHashCode() {
return ((int)value ^ (int)(value >> 32));
}
}

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧