2013-06-12 34 views
1

我正在使用(更多可重用的)泛型等價物從舊的項目中重新生成一些容器類。我似乎年前已經去我的方式,以確保TKey類型Dictionary是一個int,而不是我的容器的T型(在這種情況下,Tlong)。如果C#字典在x86上具有64位TKey,會發生什麼情況?

如果我改寫這個以允許使用long,那麼Dictionary類中真正發生了什麼?它是否會強制將64位值類型TKey散列到32位int中?也許是這樣的:

int hashKey32bit = tkey.GetHashCode(); 
+1

它只是調用'tkey.GetHashCode()' - 不轉換爲'object'因爲'GetHashCode()'已經是所有可能類型的成員。無論如何,如果你把鑰匙改成「長」,它應該會起作用。 –

+0

@MthetheWWatson哦,你說得對,拳擊是不需要的,我會編輯 –

回答

0

GetHashCode方法總是返回一個32位的int,不管你叫什麼類型或系統它。那就是它的意義,我在那裏沒有看到任何有力的東西。畢竟,使用任何大小的任何對象或結構作爲關鍵都沒有問題。 (如果他們有一些有用的實現GetHashCode。)

字典可能最終會發生一些衝突,但只要散列碼在32位範圍內均勻分佈,那很好。

編輯

所以,是的,字典總是調用GetHashCode方法,即使int,它是相當簡單:

public override int GetHashCode() 
{ 
    return this; 
} 

對於longint64)它看起來像這樣:

public override int GetHashCode() 
{ 
    return (int) this^(int) (this >> 32); 
} 
相關問題