我正試圖設計一個簡單的應用程序來計算文件的CRC32/MD5/SHA1/SHA256/SHA384/SHA512,並且我遇到了一點障礙。這是在C#中完成的。如何在同一時間以多種方式散列單個文件?
我希望能夠儘可能有效地做到這一點,所以我最初的想法是在處理之前先將文件讀入內存流中,但我很快發現非常大的文件會導致內存不足很快。所以看起來我必須改用文件流。正如我所看到的那樣,問題是一次只能運行一個散列函數,而使用文件流執行散列函數需要一段時間才能完成每個散列函數。
我該如何去讀取一小段文件到內存中,使用所有6種算法處理它,然後進入另一個塊......或者散列法不是以這種方式工作?
這是我最初嘗試將文件讀入內存。它沒有當我試圖運行在MemoryStream的哈希算法之前讀取CD映像裝入內存:
private void ReadToEndOfFile(string filename)
{
if (File.Exists(filename))
{
FileInfo fi = new FileInfo(filename);
FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read);
byte[] buffer = new byte[16 * 1024];
//double step = Math.Floor((double)fi.Length/(double)100);
this.toolStripStatusLabel1.Text = "Reading File...";
this.toolStripProgressBar1.Maximum = (int)(fs.Length/buffer.Length);
this.toolStripProgressBar1.Value = 0;
using (MemoryStream ms = new MemoryStream())
{
int read;
while ((read = fs.Read(buffer, 0, buffer.Length)) > 0)
{
ms.Write(buffer, 0, read);
this.toolStripProgressBar1.Value += 1;
}
_ms = ms;
}
}
}
我試過讓這個工作使用MD5,程序運行,雖然它似乎是生成不正確的散列。 這是我的代碼鏈接:[鏈接](http://pastebin.com/i3iPwYZv) – agent154 2012-04-26 23:52:16
調用'TransformFinalBlock'時應該使用'read'而不是'buffer.Length' – 2012-04-27 05:41:06
非常感謝!我昨晚爲此苦苦了一陣子。結束了一些愚蠢的行爲,希望能夠實現它,但我忍不住覺得這是沒有必要的。 我發現這是因爲最後一個數組被完全讀取,即使最後一個數據塊對它來說太小。我最終創建了一個新的字節數組,最後一塊等於最後一個塊的大小。 – agent154 2012-04-27 11:50:02