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 仍然足够。