2012-10-31 72 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 ..和別人