用作特定类型的哈希函数,适合在哈希算法和数据结构(如哈希表)中使用。[Visual Basic]
Public Overridable Function GetHashCode() As Integer[C#]
public virtual int GetHashCode();[C++]
public: virtual int GetHashCode();[JScript]
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 可能不会正常工作。
Public Overridable Function GetHashCode() As Integer[C#]
public virtual int GetHashCode();[C++]
public: virtual int GetHashCode();[JScript]
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 可能不会正常工作。
解决方案 »
- 错误 命名空间“System”中不存在类型或命名空间名称“Linq”(是缺少程序集引用吗?) 什么意思
- asp.net如何获取【网站用户登录的外网IP和IP所在区域】
- Winform设置backgroundImage问题(在线等,问题解决分不够继续追加)
- 正则表达式匹配中间的文字。--急,在线等!!!
- 想用C#做个测试用木马....请帮帮我
- 智能提示的换行问题
- 怎么用回朔算法解国际象棋中的骑士问题?
- 100分求,怎么用c#开发桌面录制东西,有点提示吗?
- 如何在VS.net2003 中 单步调试存储过程 ?
- C#程序可不可以调用的flash做的东西?如何调用?
- DataGrid如何填充一个查询结果?
- 如果获得远程机器的操作系统版本?
[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));
}
}
我已经清楚了很多。
能否再说明一下如何使用此函数来搜索元素。
检索时,健在此被哈希