2015-09-10 41 views
0

我有一個覆蓋Equals()方法的結構和編譯器抱怨GetHashCode()沒有被覆蓋。如何在C#結構實現GetHashCode()方法

我的結構:

private struct Key 
    { 
    ... 

    public override int GetHashCode() 
    { 
     return ?; 
    } 

    public int FolderID; 
    public MyEnum SubItemKind; 
    public int SubItemID; 
    } 

什麼是實現GetHashCode()方法的正確方法?

一個)

return FolderID^SubItemKind.GetHashCode()^SubItemID; 

,或者b)

return FolderID.GetHashCode()^SubItemKind.GetHashCode()^SubItemID.GetHashCode(); 
+3

'System.Int32.GetHashCode()'執行簡單的'返回this'(至少在mscorlib程序V4),所以你的兩段代碼就相當於反正。 –

+1

這個問題是不特定於'struct'。問題的核心是多哈希碼組合成一個,這是在上回答了「什麼是一個重寫System.Object.GetHashCode最好的算法?」解釋題。 – dasblinkenlight

回答

3

始終後者。前者是不夠的,因爲大多數位爲0(你的號碼是最有可能小),而這些零是最顯著位。你會浪費很多的哈希碼,從而獲得了更多的衝突。

這樣做的另一種常見的方式是通過一個素數,依靠乘上溢出的每個項目:

return unchecked(FolderID.GetHashCode() * 23 * 23 
       + SubItemKind.GetHashCode() * 23 
       + SubItemID.GetHashCode()); 

編輯:更新後可使用unchecked顯式的溢出支持,每stakx的評論。

+4

不要忘了包裹在'選中(...)'塊整個表達式,否則你可能會得到一個例外,由於可能的溢出。 – stakx

+1

參見[此答案由喬恩斯基特(​​http://stackoverflow.com/a/263416/240733)的問題,[「什麼是一個重寫System.Object.GetHashCode最好的算法?」(HTTP: //stackoverflow.com/q/263400/240733)。 – stakx

+0

不知道他評論的主題,是啊'unchecked'是有道理的。 – Blindy