在大型文件上计算单个MD5校验和时,通常使用哪种技术将各种MD5值合并为单个值?你只是把它们加在一起吗?我对任何特定的语言、库或API都不感兴趣,我只对它背后的技术感兴趣。有人能解释一下它是怎么做到的吗?
在伪代码中给出以下算法:
MD5Digest X
for each file segment F
MD5Digest Y = CalculateMD5(F)
Combine(X,Y)但是Combine到底会怎么做呢?它是将两个MD5摘要加在一起,还是别的什么?
发布于 2010-02-07 02:55:53
,以便为内存中无法容纳的文件计算MD5值
考虑到这一点,您不希望“组合”两个MD5散列。对于任何MD5实现,您都有一个保持当前校验和状态的对象。因此,您可以在任何时候提取MD5校验和,这在散列共享相同开头的两个文件时非常方便。对于大文件,您只需不断输入数据-如果您一次性散列文件或按块散列文件,则没有区别,因为状态会被记住。在这两种情况下,您将得到相同的散列。
发布于 2010-02-07 02:56:33
MD5是一种迭代算法。你不需要计算一吨的小MD5,然后以某种方式将它们组合起来。您只需读取文件的一小部分,并将它们添加到摘要中,因此您永远不需要一次在内存中拥有整个文件。这是一个java实现。
FileInputStream f = new FileInputStream(new File("bigFile.txt"));
MessageDigest digest = MessageDigest.getInstance("md5");
byte[] buffer = new byte[8192];
int len = 0;
while (-1 != (len = f.read(buffer))) {
digest.update(buffer,0,len);
}
byte[] md5hash = digest.digest();就是这样。您拥有整个文件的MD5,而不需要立即将整个文件保存在内存中。
值得注意的是,如果由于某些原因,您需要文件的各个子段的MD5散列(这有时对于对通过低带宽连接传输的大文件执行临时检查很有用),那么您可以随时通过克隆摘要对象来获得它们,如下所示
byte[] interimHash = ((MessageDigest)digest.clone()).digest();这不会影响实际的摘要对象,因此您可以继续使用整个MD5散列。
还值得注意的是,出于加密目的(例如验证来自不可信来源的文件真实性),MD5是一个过时的散列,在大多数情况下应该替换为更好的散列,例如SHA-1。对于非加密目的,例如验证两个可信来源之间的文件完整性,MD5仍然足够。
发布于 2010-02-07 02:50:23
openSSL库允许您将数据块添加到正在进行的散列(sha1/md5)中,然后当您完成添加所有数据时,调用Final方法,它将输出最终的散列。
您不必在每个单独的块上计算md5,然后添加它,而是将数据添加到openssl库中正在进行的散列方法中。然后,这将为您提供所有单个数据块的md5散列,而不限制输入数据的大小。
http://www.openssl.org/docs/crypto/md5.html#
https://stackoverflow.com/questions/2214259
复制相似问题