我正在尝试设计一个简单的应用程序来计算文件的 CRC32/md5/sha1/sha256/sha384/sha512,但我遇到了一些障碍。这是在 C# 中完成的。
我希望能够尽可能高效地做到这一点,所以我最初的想法是在处理之前先将文件读入内存流,但我很快发现非常大的文件会导致我很快耗尽内存。所以看来我必须改用文件流。正如我所看到的,问题是一次只能运行一个哈希函数,并且使用文件流这样做需要一段时间才能完成每个哈希。
我该如何将文件的一小部分读入内存,使用所有 6 种算法对其进行处理,然后再进入另一个块……或者散列不是那样工作的?
这是我最初尝试将文件读入内存。当我在内存流上运行散列算法之前尝试将 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;
}
}
}