如何同时以多种方式散列单个文件?

age*_*154 5 c# hash cryptography

我正在尝试设计一个简单的应用程序用于计算文件的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;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

Mat*_*ker 4

你已经完成了大部分工作,只是不需要立即将整个内容读入内存。

.Net 中的所有哈希都派生自HashAlgorithm类。这有两个方法:TransformBlockTransformFinalBlock。因此,您应该能够读取文件的块,将其填充到您要使用的哈希值的 TransformBlock 方法中,然后移至下一个块。只需记住TransformFinalBlock从文件中调用最后一个块,因为这就是获取包含哈希值的字节数组的原因。

现在,我只会一次执行每个散列,直到它正常工作,然后担心同时运行散列(使用诸如任务并行库之类的东西)