【发布时间】:2012-10-31 14:35:15
【问题描述】:
C# 中的对象有四种方法 - {Equals、GetType、ToString、GetHashCode}。
有人可以用哈希码做什么有用的事情?
【问题讨论】:
C# 中的对象有四种方法 - {Equals、GetType、ToString、GetHashCode}。
有人可以用哈希码做什么有用的事情?
【问题讨论】:
人们可以用哈希码做什么有用的事情?
快速找到可能相等的对象。
特别是,这种方法通常被Dictionary<TKey, TValue>(用于键)和HashSet<T>等类型使用。
您应该不假设具有相同哈希码的对象是相等的,但是。请参阅Eric Lippert's blog post 了解更多信息,并参阅Wikipedia hash table 页面了解有关哈希码使用的更一般性讨论。
【讨论】:
哈希码是用于识别对象的数值 在平等测试期间。它也可以作为对象的索引 在一个集合中。
GetHashCode 方法适用于散列算法和 哈希表等数据结构。
GetHashCode 方法的默认实现没有 保证不同对象的唯一返回值。此外, .NET Framework 不保证默认实现 GetHashCode 方法,它返回的值在 .NET Framework 的不同版本。因此,默认 此方法的实现不得用作唯一对象 用于散列目的的标识符。
GetHashCode 方法可以被派生类型覆盖。价值 types 必须重写此方法以提供哈希函数 适合该类型并提供有用的分布 哈希表。为了唯一性,哈希码必须基于值 实例字段或属性,而不是静态字段或 属性。
在 Hashtable 对象中用作键的对象也必须覆盖 GetHashCode 方法,因为这些对象必须生成自己的哈希 代码。如果用作键的对象不提供有用的 GetHashCode 的实现,你可以指定一个哈希码提供者 当构造 Hashtable 对象时。在 .NET 框架之前 2.0 版,哈希码提供程序基于 System.Collections.IHashCodeProvider 接口。从版本开始 2.0,哈希码提供者是基于 System.Collections.IEqualityComparer 接口。
【讨论】:
基本思想是,如果两个对象具有不同的哈希码,它们就是不同的。如果它们具有相同的哈希码,则它们可能不同或相等。
要检查集合中是否存在对象,您可以首先检查哈希码,如果您正在比较整数,这会很快,然后只对具有相同哈希码的对象进行更准确的测试。
这用于集合类中,例如。
【讨论】:
GetHashCode 的存在只是为了这两种类型的利益
->哈希表
->通用字典
GetHashCode 为您提供多种密钥,以实现良好的 hashtable 性能。
当编译时类型未知时,Equals 提供null-safe 相等比较。
它的签名是
public static bool Equals(object A,object B).
因此,如果在编译时类型未知,则不能使用 == 或 != 之类的运算符。您必须使用 Equals
在编写泛型类型时很有用
例如:
class Test<T>
{
T value;
public void SetV(T newValue)
{
if(object.Equals(newValue,value))
//We have to use Object.Equals cant use == or !=since they cannot bind to unknown type at compile time
}
}
它返回类型实例的默认texual representation。此方法被所有内置类型覆盖
GetType 是在运行时评估的。它可以帮助我们了解类型的 name,assemby,base type..等
【讨论】: