2015-04-28 146 views
3

我的應用程序作爲一個Windows服務運行,我將VS2013附加到它的進程調試。我得到的哈希代碼的圖像文件的內容來檢查以下方法差異(靜態類中):C#String.getHashCode()爲不同的字符串返回相同的值

static class FileUtils 
{ 
    public static int GetFileHash(string filePath) 
    { 
     int hash = 0; 
     Logger.WriteLog(ToolTipIcon.Info, "Calculating hash code for {0}", filePath); 
     StreamReader sr = new StreamReader(filePath, Encoding.Unicode); 
     hash = sr.ReadToEnd().GetHashCode(); 
     sr.Close(); 
     return hash; 
    } 
} 

已在生產中正常工作。但是,此方法將始終返回2074746262兩個不同的圖像。我試圖在具有相同代碼和圖像的WinForms應用程序中重現這一點,但我不能。在VS2013中調試進程會有什麼問題會導致這種行爲?我用完全不同的圖像替換了其中一幅圖像,但仍然發生。

+0

什麼調用這個樣子的代碼?它是否穿線? – Liam

+5

誰說'string.GetHashCode'將是唯一的?這取決於代碼執行的日期等 –

+3

'GetHashCode'不適用於爲大型二進制文件創建摘要。使用例如改爲MD5或SHA1散列。谷歌的「密碼哈希」。 – stakx

回答

8

首先,你應該知道,你正在使用GetHashCode錯誤,原因有二:

  1. 散列碼不是唯一的,也有僅僅是很好的分佈。有一定數量的哈希碼和無限數量的二進制字符串,因此在物理上不可能爲每個字符串生成唯一的哈希碼。

  2. 哈希碼算法的細節沒有明確記錄,並且由於與您無關的原因而改變。特別是,這不是我第一次看到它報道了調試器下運行時string.GetHashCode()改變行爲:

string.GetHashCode() returns different values in debug vs release, how do I avoid this?


說了這麼多,似乎有點不同尋常, 三個不同的二進制字符串會在同一個運行時環境中進行不同的散列,這取決於是否附加了調試器。除了像你一樣不信任GetHashCode,我的下一個猜測是你不會哈希你認爲你正在哈希的東西。在散列之前,我會將二進制數據本身轉儲到磁盤,並確認您確實有不同的二進制字符串。

+1

我已經做了轉儲,是的他們是不同的。 getHashCode用法是遺留代碼。我想我可能會按照建議更新SHA或MD5。 – Phil

1

使用GetHasCode來檢查唯一性將永遠不會工作,但不能保證每個不同的對象都會給出不同的哈希碼。

2

Documentation explicitly calls this out。不要依賴String.GetHashCode來保持獨特性。你的假設是錯誤的。

如果兩個字符串對象相等,則GetHashCode方法返回相同的值 。但是,對於每個唯一字符串值, 沒有唯一的哈希碼值。 不同的字符串可以返回相同的散列 代碼

相關問題