2012-10-31 100 views

回答

16

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

快速找到潜在等于对象。

特别是,此方法通常使用的类型如Dictionary<TKey, TValue>(用于密钥)和HashSet<T>

您应该而不是然而,假设具有相同散列码的对象相等。有关更多信息,请参阅Eric Lippert's blog post;有关散列码使用的更一般性讨论,请参阅Wikipedia hash table页面。

+0

钥匙?是不是通过equals方法认为键是不同的? (IEquatable)? –

+0

@RoyiNamir:是的,但他们首先*通过哈希码进行比较 - 因为这样可以便宜地获得*潜力*匹配。否则,每次从字典中提取都需要检查每个密钥的均等性。 –

+0

为什么编译器会打扰做潜在的匹配,如果等于可以破坏它的假设? (我知道重写等于要求重载getHashCode) - 但那是另一个问题。 –

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接口。

- Sourced from MSDN

0

的基本想法是,如果两个物体有不同的hash code,它们是不同的。如果它们具有相同的哈希码,则它们可以不同或相等。

要检查某个对象是否存在于一个集合中,您可以首先检查哈希码,因为您正在比较整数,所以它会很快检查,然后仅对具有相同哈希码的对象执行更准确的测试。例如,

这被用在集合类中。

0

的GetHashCode

GetHashCode只存在这两种类型

的利益 - >哈希表

- >GenericDictionary

的GetHashCode为您提供了良好的hashtable表现多样键。

的Equals

Equals为当类型是在编译时未知一个null-safe相等比较。 其签名是

public static bool Equals(object A,object B)

所以你不能使用运营商如==!=如果类型是在编译time.You未知已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 
    } 
} 

ToString

它返回一个类型实例的默认texual representation.Thi S分析是所有内建类型

的GetType

GetType在runtime.It评估重写帮助我们知道是什么类型的nameassembybase type ..和别人