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

标签 c# cryptography hash

我正在尝试设计一个用于计算文件的 CRC32/md5/sha1/sha256/sha384/sha512 的简单应用程序,但遇到了一些障碍。这是在 C# 中完成的。

我希望能够尽可能高效地执行此操作,所以我最初的想法是在处理之前先将文件读入内存流,但我很快发现非常大的文件导致我非常耗尽内存迅速地。所以看起来我必须改用文件流。正如我所看到的,问题在于一次只能运行一个哈希函数,而使用文件流执行此操作将需要一段时间才能完成每个哈希。

我如何才能将一小部分文件读入内存,使用所有 6 种算法对其进行处理,然后转到另一个 block ...或者哈希不是那样工作的吗?

这是我最初尝试将文件读入内存的尝试。当我在内存流上运行哈希算法之前尝试将 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;
            }
        }
    }

最佳答案

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

.Net 中的所有哈希都来自 HashAlgorithm类(class)。它有两个方法:TransformBlockTransformFinalBlock。因此,您应该能够为您的文件读取一个 block ,将其填充到您想要使用的任何哈希的 TransformBlock 方法中,然后移动到下一个 block 。请记住为文件中的最后一个 block 调用 TransformFinalBlock,因为这就是让您获得包含哈希的字节数组的原因。

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

关于c# - 如何同时以多种方式散列单个文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10336535/

相关文章:

encryption - 使用 RSA_set0_key(key, n,e,d) 时 RSA_public_decrypt 失败?

php - 我究竟如何在 PHP 中使用河豚?

php - 社会保障/政府 ID 号的哈希和盐的替代方案

c# - 获取 C# 中的分配总数

c# - Silverlight,如何制作UserControl列表(在ContentControl中?)

c# - 静态变量和多线程

javascript - 我可以禁止外部可执行内容(外部 javascript)吗?

c# - C# 中使用 Rijndael 解密

javascript - 单页应用程序中的后退按钮处理?

c# - asp.net datalist 数据绑定(bind)