首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >组合MD5散列值

组合MD5散列值
EN

Stack Overflow用户
提问于 2010-02-07 02:45:34
回答 7查看 13.1K关注 0票数 14

在大型文件上计算单个MD5校验和时,通常使用哪种技术将各种MD5值合并为单个值?你只是把它们加在一起吗?我对任何特定的语言、库或API都不感兴趣,我只对它背后的技术感兴趣。有人能解释一下它是怎么做到的吗?

在伪代码中给出以下算法:

代码语言:javascript
复制
MD5Digest X
for each file segment F
   MD5Digest Y = CalculateMD5(F)
   Combine(X,Y)

但是Combine到底会怎么做呢?它是将两个MD5摘要加在一起,还是别的什么?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-02-07 02:55:53

,以便为内存中无法容纳的文件计算MD5值

考虑到这一点,您不希望“组合”两个MD5散列。对于任何MD5实现,您都有一个保持当前校验和状态的对象。因此,您可以在任何时候提取MD5校验和,这在散列共享相同开头的两个文件时非常方便。对于大文件,您只需不断输入数据-如果您一次性散列文件或按块散列文件,则没有区别,因为状态会被记住。在这两种情况下,您将得到相同的散列。

票数 16
EN

Stack Overflow用户

发布于 2010-02-07 02:56:33

MD5是一种迭代算法。你不需要计算一吨的小MD5,然后以某种方式将它们组合起来。您只需读取文件的一小部分,并将它们添加到摘要中,因此您永远不需要一次在内存中拥有整个文件。这是一个java实现。

代码语言:javascript
复制
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散列(这有时对于对通过低带宽连接传输的大文件执行临时检查很有用),那么您可以随时通过克隆摘要对象来获得它们,如下所示

代码语言:javascript
复制
byte[] interimHash = ((MessageDigest)digest.clone()).digest();

这不会影响实际的摘要对象,因此您可以继续使用整个MD5散列。

还值得注意的是,出于加密目的(例如验证来自不可信来源的文件真实性),MD5是一个过时的散列,在大多数情况下应该替换为更好的散列,例如SHA-1。对于非加密目的,例如验证两个可信来源之间的文件完整性,MD5仍然足够。

票数 6
EN

Stack Overflow用户

发布于 2010-02-07 02:50:23

openSSL库允许您将数据块添加到正在进行的散列(sha1/md5)中,然后当您完成添加所有数据时,调用Final方法,它将输出最终的散列。

您不必在每个单独的块上计算md5,然后添加它,而是将数据添加到openssl库中正在进行的散列方法中。然后,这将为您提供所有单个数据块的md5散列,而不限制输入数据的大小。

http://www.openssl.org/docs/crypto/md5.html#

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2214259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档