2011-04-25 140 views
1

在C#中是否有一種在實例化新哈希表時定義密鑰大小的方法?有沒有一種方法來定義鍵值的大小?

Hashtable myHash = new Hashtable(); 

我想爲密鑰大小使用較長的值,但我似乎超過了可用的密鑰大小,因爲我得到負數。我一起乘以一些素數,最大的返回值是23 * 23 * 23 * 23 * 23 * 23 * 23 * 23 * 23 = 1801152661463.

謝謝。

回答

2

首先,如果您使用.net 3.5或更高版本,您應該使用HashSet<T>,如果您使用.net 2,則應該使用Dictionary<T,bool>。通用集合提供更好的編譯時檢查,更少的強制轉換和更少的裝箱。

int overflow最有可能發生在插入當前代碼中的Hashtable之前。所以你觀察到的錯誤很可能與Hashtable無關,但它是算術代碼中的一個錯誤。您可能需要投些東西給long。但除非您發佈相關代碼,否則我無法告訴您發生溢出的確切位置。

+0

你可能是對的,我會回去檢查,可能在乘法部分。 – flavour404 2011-04-25 18:13:32

+0

謝謝,你是正確的,我是作爲整數值乘以和最大值被超過,然後寫入一個長期。我把它們全部轉換到乘法線之前,現在它正常工作。我驗證了結果,他們確實是正確的。謝謝你的評論真的有幫助。 – flavour404 2011-04-25 18:48:59

0

.NET HashtableHashSet<T>類都調用object.GetHashCode()來檢索散列。由於GetHashCode()返回一個int,即所使用的散列鍵的大小。

如果您想提供自己的散列函數,您可以覆蓋要插入的類型中的GetHashCode(),或者定義自定義的IEqualityComparer<T>並將其傳遞給HashSet構造函數。但是,IEqualityComparer<T>.GetHashCode()方法也返回一個整數鍵,所以我不確定這將滿足您的需求。

如果您的應用程序需要大於int的散列鍵,您可能需要創建自己的HashSet數據結構。

0

由於System.Object方法GetHashCode()返回一個int,我要說的是,你的哈希碼算法的選擇是僅限於那些返回一個32位值(無論你想稱之爲符號或無符號不成型差分:散列值只是一個任意的32位值)。

HashTable並不關心你的鍵或值是什麼:就它而言,它們都只是對象。你可能想確保你的重寫和實施GetHashCode()Equals()。也可能想考慮一下IComparable的實現。

相關問題