cha*_*l72 14 algorithm checksum md5
在大文件上计算单个MD5校验和时,通常使用什么技术将各种MD5值组合成单个值?你刚刚把它们加在一起吗?我对任何特定的语言,库或API都不感兴趣; 相反,我只对它背后的技术感兴趣.有人可以解释它是如何完成的吗?
给出伪代码中的以下算法:
MD5Digest X
for each file segment F
MD5Digest Y = CalculateMD5(F)
Combine(X,Y)
Run Code Online (Sandbox Code Playgroud)
但究竟会Combine
做什么?它是否将两个MD5摘要一起添加,或者是什么?
And*_*Dog 16
为了计算太大而无法放入内存的文件的MD5值
考虑到这一点,您不希望"合并"两个MD5哈希值.对于任何 MD5实现,您都有一个保持当前校验和状态的对象.因此,您可以随时提取MD5校验和,这在散列共享相同开头的两个文件时非常方便.对于大文件,您只需继续输入数据 - 如果您一次或在块中散列文件,则没有区别,因为状态会被记住.在这两种情况下,您将获得相同的哈希值.
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();
Run Code Online (Sandbox Code Playgroud)
瞧瞧.您拥有整个文件的MD5,而不会将整个文件同时存储在内存中.
值得注意的是,如果出于某种原因,你确实需要MD5哈希的文件子部分(这有时对通过低带宽连接传输的大文件进行临时检查有用),那么你可以通过克隆获得它们摘要对象在任何时候都是这样的
byte[] interimHash = ((MessageDigest)digest.clone()).digest();
Run Code Online (Sandbox Code Playgroud)
这不会影响实际的摘要对象,因此您可以继续使用整个MD5哈希.
还值得注意的是MD5是用于加密目的的过时哈希(例如从不受信任的源验证文件真实性),并且应该在大多数情况下用更好的东西替换,例如SHA-1.对于非加密目的,例如验证两个可信源之间的文件完整性,MD5仍然足够.