2016-03-30 42 views
0

爲什麼每次我調用執行相同操作的函數({})時,該哈希代碼都會以不同的方式生成。值是是37121646然後當我再次運行它是45592480.GetHashCode for StringBuilder生成不同的代碼

static void Main(string[] args) 
    { 

     int a; 
     Program pp = new Program(); 
     a = pp.getHash(); 
    } 

    private int getHash() 
    { 
     StringBuilder id = new StringBuilder(); 
     for (int i = 0; i < 5; i++) 
     { 
      id.Append(i); 
     } 
     return id.GetHashCode(); 
    } 
+0

可能的[C#中的GetHashCode指南]的副本(http://stackoverflow.com/questions/462451/gethashcode-guidelines-in-c-sharp) – Steve

回答

0

StringBuilder是可變的對象,因此使用它的方法GetHashCode不是很實用。

由於導致沒有特殊的實現(不像strings),這將導致基礎上的物體的價值,而不是它的參考標識(默認情況下,同樣爲所有其他引用類型)。

要確認您可以檢查MSDN StringBuilder類以瞭解詳細信息,請參閱GetHashCode是「繼承自Object」。

4

這是因爲散列碼並不意味着在對象的整個生命週期內都會改變。

如果你考慮字典,這個原因應該很清楚。字典的訪問時間非常快,因爲對象基於哈希代碼放在桶中,所以當你想獲得一個值時,字典不需要搜索所有的值,它就直接進入由哈希代碼定義的桶。如果哈希代碼改變,那麼查找將失敗。

所以,對於可變對象有一個問題。散列碼不能依賴於這些值,因爲如果它確實存在,那麼散列碼將在這些值發生改變時發生改變,並且散列碼不能改變。

因此,對於StringBuilder,哈希碼完全基於實例的引用。如果你創建一個新的實例,你有一個新的哈希碼。它並不基於內容。

0

我想你想做到這一點...

id.ToString().GetHashCode(); 

的哈希碼在一個字符串,就是要不斷在很短的時間,但不能跨多個長的時間甚至可以跨越或重新編譯版本運行時間。即不要在執行實例之外使用它。存儲價值幾乎可以保證自殺。