6

C# 中的对象有四种方法 - { Equals, GetType, ToString, GetHashCode}。
有人可以用哈希码做什么样的有用的事情?

4

4 回答 4

16

有人可以用哈希码做什么样的有用的事情?

快速找到可能相等的对象。

特别是,这种方法通常被Dictionary<TKey, TValue>(for the keys) 和HashSet<T>.

但是,您不应该假设具有相同哈希码的对象是相等的。有关更多信息,请参阅Eric Lippert 的博客文章,以及有关使用哈希码的更一般性讨论的Wikipedia 哈希表页面。

于 2012-10-31T14:36:32.160 回答
2

哈希码是一个数值,用于在相等性测试期间识别对象。它还可以用作集合中对象的索引。

GetHashCode 方法适用于散列算法和数据结构,如散列表。

GetHashCode 方法的默认实现不保证不同对象的唯一返回值。此外,.NET Framework 不保证 GetHashCode 方法的默认实现,它返回的值在不同版本的 .NET Framework 之间是相同的。因此,此方法的默认实现不得用作散列目的的唯一对象标识符。

GetHashCode 方法可以被派生类型覆盖。值类型必须重写此方法以提供适合该类型的散列函数并在散列表中提供有用的分布。为了唯一性,哈希码必须基于实例字段或属性的值,而不是静态字段或属性。

用作 Hashtable 对象中的键的对象也必须覆盖 GetHashCode 方法,因为这些对象必须生成自己的哈希码。如果用作键的对象未提供有用的 GetHashCode 实现,则可以在构造 Hashtable 对象时指定哈希码提供程序。在 .NET Framework 2.0 版之前,哈希码提供程序基于 System.Collections.IHashCodeProvider 接口。从 2.0 版开始,哈希码提供程序基于 System.Collections.IEqualityComparer 接口。

- 来自 MSDN

于 2012-10-31T14:36:50.793 回答
0

基本思想是,如果两个对象具有不同的哈希码,它们就是不同的。如果它们具有相同的哈希码,则它们可能不同或相等。

要检查集合中是否存在对象,您可以首先检查哈希码,如果您正在比较整数,这会很快,然后只对具有相同哈希码的对象进行更准确的测试。

例如,这用于集合类中。

于 2012-10-31T14:39:21.320 回答
0

获取哈希码

GetHashCode只为这两种类型的利益而存在

->哈希表

->通用字典

GetHashCode 为您提供各种键以获得良好的hashtable性能。

等于

null-safe当编译时类型未知时,Equals 提供相等比较。它的签名是

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.. 和其他

于 2012-10-31T15:26:09.880 回答