在C#中是否有一種在實例化新哈希表時定義密鑰大小的方法?有沒有一種方法來定義鍵值的大小?
Hashtable myHash = new Hashtable();
我想爲密鑰大小使用較長的值,但我似乎超過了可用的密鑰大小,因爲我得到負數。我一起乘以一些素數,最大的返回值是23 * 23 * 23 * 23 * 23 * 23 * 23 * 23 * 23 = 1801152661463.
謝謝。
在C#中是否有一種在實例化新哈希表時定義密鑰大小的方法?有沒有一種方法來定義鍵值的大小?
Hashtable myHash = new Hashtable();
我想爲密鑰大小使用較長的值,但我似乎超過了可用的密鑰大小,因爲我得到負數。我一起乘以一些素數,最大的返回值是23 * 23 * 23 * 23 * 23 * 23 * 23 * 23 * 23 = 1801152661463.
謝謝。
首先,如果您使用.net 3.5或更高版本,您應該使用HashSet<T>
,如果您使用.net 2,則應該使用Dictionary<T,bool>
。通用集合提供更好的編譯時檢查,更少的強制轉換和更少的裝箱。
int overflow最有可能發生在插入當前代碼中的Hashtable
之前。所以你觀察到的錯誤很可能與Hashtable
無關,但它是算術代碼中的一個錯誤。您可能需要投些東西給long
。但除非您發佈相關代碼,否則我無法告訴您發生溢出的確切位置。
.NET Hashtable
和HashSet<T>
類都調用object.GetHashCode()
來檢索散列。由於GetHashCode()
返回一個int
,即所使用的散列鍵的大小。
如果您想提供自己的散列函數,您可以覆蓋要插入的類型中的GetHashCode()
,或者定義自定義的IEqualityComparer<T>
並將其傳遞給HashSet構造函數。但是,IEqualityComparer<T>.GetHashCode()
方法也返回一個整數鍵,所以我不確定這將滿足您的需求。
如果您的應用程序需要大於int
的散列鍵,您可能需要創建自己的HashSet數據結構。
由於System.Object
方法GetHashCode()
返回一個int,我要說的是,你的哈希碼算法的選擇是僅限於那些返回一個32位值(無論你想稱之爲符號或無符號不成型差分:散列值只是一個任意的32位值)。
HashTable並不關心你的鍵或值是什麼:就它而言,它們都只是對象。你可能想確保你的重寫和實施GetHashCode()
和Equals()
。也可能想考慮一下IComparable
的實現。
你可能是對的,我會回去檢查,可能在乘法部分。 – flavour404 2011-04-25 18:13:32
謝謝,你是正確的,我是作爲整數值乘以和最大值被超過,然後寫入一個長期。我把它們全部轉換到乘法線之前,現在它正常工作。我驗證了結果,他們確實是正確的。謝謝你的評論真的有幫助。 – flavour404 2011-04-25 18:48:59