2014-01-18 74 views
0

如何計算MD5哈希的文件在C#中的下一個方法:在C#中的文件MD5哈希

Compute hash for range 1-4096 bytes -> get MD5 hash for this range; 
1-8192 -> get MD5 hash for this range; 
1-12288 -> get MD5 hash for this range; 
1-16384 -> get MD5 hash for this range; 
... 
1-end of file -> get MD5 hash for file. 

所以我一直使用緩衝區大小爲4096個字節讀取文件,並希望所有更新哈希閱讀的一部分文件。如何實現它?看起來像MD5CryptoServiceProvider不能幫助完成此任務。

+1

目前尚不清楚您爲什麼要這樣做。爲什麼不只是整個文件?爲什麼你需要每個部分的散列? –

+0

試試這個鏈接http://stackoverflow.com/questions/827527/c-sharp-md5-hasher-example – Mzf

+0

我想通過內容比較文件的大計數和閱讀這個文件的偏好是比較它們的好策略。最後讀取部分的校驗和不是我所需要的,我想獲得所有讀取文件部分的校驗和。 –

回答

1

通常情況下,MD5和其他散列不能像那樣工作。他們在最後一個塊中使用了一定的填充。所以如果你計算一些字節的最後一個散列,你不能在以後增加更多的字節。一旦你添加了最後的塊並計算出散列值,那麼它就結束了,你必須重新開始。

我知道你想計算散列,但也繼續前進。

最好的策略是使用自定義的MD5實現,讓你克隆它的狀態。添加一個塊時,請複製MD5算法的狀態,以便您必須使MD5哈希器具有相同的狀態。您使用其中一個克隆來完成轉換。你用另一個去更進一步。僞代碼:

hasher = new md5 
loop 
    read a block of the file 
    hasher.addblock(current block) 
    hasher2 = hasher.clone() 
    hasher.finish() 
    hasher = hasher2 
end loop 
+0

是的,這是我需要的。複製散列對象的狀態。但是沒有辦法做到這一點。我嘗試了這個答案的代碼:http://stackoverflow.com/a/11308879/2183994但它不起作用。 –

+0

MD5CryptoServiceProvider使用非託管API(本機Windows CSP),因此無法在.NET中克隆它。你需要一個純粹的.NET MD5實現,它應該很容易找到。在舊的.NET框架中可能有一個MD5Managed類,我不太清楚,但你仍然可以找到像這樣命名的類。這裏:http://archive.msdn.microsoft.com/SilverlightMD5/Wiki/View.aspx?title=MD5管理 – fejesjoco

+0

謝謝你的建議! MD5Managed是很好的解決方案。 –