2009-04-30 46 views
11

我使用下面的代碼來計算文件的MD5SUM -計算MD5SUM

byte[] b = System.IO.File.ReadAllBytes(file); 
string sum = BitConverter.ToString(new MD5CryptoServiceProvider().ComputeHash(b)); 

也能正常工作正常,但如果我遇到一個大文件(〜1GB) - 例如一個ISO映像或一個DVD VOB文件 - 我得到一個內存不足異常。

雖然,我能夠在大約10secs中計算相同文件的cygwin中的MD5SUM。

請建議我如何才能在我的程序中使用大文件。

感謝

回答

29

我建議使用另一種方法:

MD5CryptoServiceProvider.ComputeHash(Stream) 

,只是在傳遞上打開文件的輸入流。這種方法幾乎可以肯定而不是一次讀入內存中的整個文件。

我還會注意到,在大多數MD5實現中,可能一次將byte[]數據添加到摘要函數塊中,然後在最後詢問散列。

+3

是的。 Mono實際上通過迭代讀入一個字節來實現ComputeHash(Stream)[4096](http://anonsvn.mono-project.com/viewvc/trunk/mcs/class/corlib/System.Security.Cryptography/HashAlgorithm.cs?修訂= 107126&視圖=標記)。我希望MS的實施非常相似。 一般來說,使用ReadAllBytes可能意味着你做錯了什麼。即使對於短文件,使用Stream也更加優雅。 – 2009-04-30 07:35:04