首页 文章

如何在读取数据时从数据块计算md5 [重复]

提问于
浏览
3

可能重复:可以使用缓冲读取计算MD5(或其他)哈希值?

我正在对usb闪存驱动器的整个原始内容执行md5校验和 .

我正在以1 MB的块读取驱动器 . 显然,我不会长时间保持缓冲区,因为我会很快耗尽内存 .

我想在读取时将1 MB块发送到md5算法,当我读完时,获取md5的最终值 .

有没有可以轻松实现此目的的C#代码?

2 回答

  • 0

    此方法将一次计算 input 读取 BufferSize byte 的散列:

    static byte[] CalculateHash(Stream input, HashAlgorithm algorithm)
    {
        byte[] buffer = new byte[BufferSize];
        int readCount;
    
        while ((readCount = input.Read(buffer, 0, BufferSize)) > 0)
            algorithm.TransformBlock(buffer, 0, readCount, buffer, 0);
        algorithm.TransformFinalBlock(buffer, 0, readCount);
    
        return algorithm.Hash;
    }
    

    请注意,它采用HashAlgorithm类型的参数,因此您可以计算除MD5之外的哈希值 . 这样叫:

    using (FileStream inputStream = new FileStream(InputPath, FileMode.Open))
    using (MD5 algorithm = MD5.Create())
    {
        byte[] md5Hash = CalculateHash(inputStream, algorithm);
        string md5HashHex = string.Join(string.Empty, md5Hash.Select(b => b.ToString("x2")));
    
        // Process hash array or hex string...
    }
    
  • 1

    这似乎与您尝试的有点不同,但我在通过网络传输大型文件时做了类似的事情 .

    首先,我构建一个清单文件,它是要发送的文件的每个块的列表,它的顺序,它是md5哈希 . 我将该文件发送到接收进程 .

    然后我开始发送文件块,接收器,获取它们,验证它们的哈希值,并将它们排队等待重新组装 . 如果一个块与它的哈希不匹配,它将被丢弃,并且会再次传递该块的请求 .

    一旦接收并验证了所有块,就重新组装文件,并根据清单中的完整文件哈希检查完整文件 . 如果一切都很好,我们会向发件人发回成功的回复 .

    这让我可以一次处理并验证文件的各个部分,但它不允许我根据较小源的哈希值构建哈希值 . 我不相信这是可能的,仅仅是哈希算法的本质 .

    编辑

    还有1个@ ken2k对你的问题的评论 . md5.TransformBlock()md5.TransformFinalBlock() 可能正是您正在寻找的 . 我不知道存在这样的事情 .

相关问题