可能重复:可以使用缓冲读取计算MD5(或其他)哈希值?
我正在对usb闪存驱动器的整个原始内容执行md5校验和 .
我正在以1 MB的块读取驱动器 . 显然,我不会长时间保持缓冲区,因为我会很快耗尽内存 .
我想在读取时将1 MB块发送到md5算法,当我读完时,获取md5的最终值 .
有没有可以轻松实现此目的的C#代码?
此方法将一次计算 input 读取 BufferSize byte 的散列:
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... }
这似乎与您尝试的有点不同,但我在通过网络传输大型文件时做了类似的事情 .
首先,我构建一个清单文件,它是要发送的文件的每个块的列表,它的顺序,它是md5哈希 . 我将该文件发送到接收进程 .
然后我开始发送文件块,接收器,获取它们,验证它们的哈希值,并将它们排队等待重新组装 . 如果一个块与它的哈希不匹配,它将被丢弃,并且会再次传递该块的请求 .
一旦接收并验证了所有块,就重新组装文件,并根据清单中的完整文件哈希检查完整文件 . 如果一切都很好,我们会向发件人发回成功的回复 .
这让我可以一次处理并验证文件的各个部分,但它不允许我根据较小源的哈希值构建哈希值 . 我不相信这是可能的,仅仅是哈希算法的本质 .
还有1个@ ken2k对你的问题的评论 . md5.TransformBlock() 和 md5.TransformFinalBlock() 可能正是您正在寻找的 . 我不知道存在这样的事情 .
md5.TransformBlock()
md5.TransformFinalBlock()
2 回答
此方法将一次计算
input
读取BufferSize
byte
的散列:请注意,它采用HashAlgorithm类型的参数,因此您可以计算除MD5之外的哈希值 . 这样叫:
这似乎与您尝试的有点不同,但我在通过网络传输大型文件时做了类似的事情 .
首先,我构建一个清单文件,它是要发送的文件的每个块的列表,它的顺序,它是md5哈希 . 我将该文件发送到接收进程 .
然后我开始发送文件块,接收器,获取它们,验证它们的哈希值,并将它们排队等待重新组装 . 如果一个块与它的哈希不匹配,它将被丢弃,并且会再次传递该块的请求 .
一旦接收并验证了所有块,就重新组装文件,并根据清单中的完整文件哈希检查完整文件 . 如果一切都很好,我们会向发件人发回成功的回复 .
这让我可以一次处理并验证文件的各个部分,但它不允许我根据较小源的哈希值构建哈希值 . 我不相信这是可能的,仅仅是哈希算法的本质 .
编辑
还有1个@ ken2k对你的问题的评论 .
md5.TransformBlock()
和md5.TransformFinalBlock()
可能正是您正在寻找的 . 我不知道存在这样的事情 .