MD5 es un algoritmo iterativo. No necesita calcular una tonelada de MD5 pequeños y luego combinarlos de alguna manera. Simplemente lee pequeños trozos del archivo y los agrega al resumen a medida que avanza, por lo que nunca tendrá que tener todo el archivo en la memoria a la vez. Aquí hay una implementación de 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();
Et voila. Tiene el MD5 de un archivo completo sin tener el archivo completo en la memoria a la vez.
Vale la pena señalar que si por alguna razón desea MD5 hashes de subsecciones del archivo a medida que avanza (esto a veces es útil para hacer comprobaciones provisionales en un archivo grande que se transfiere a través de una conexión de ancho de banda bajo) puede conseguir clonando el objeto de digestión en cualquier momento, al igual que
byte[] interimHash = ((MessageDigest)digest.clone()).digest();
Esto no afecta a la real digerir objeto para que pueda seguir trabajando con el hash MD5 en general.
También vale la pena señalar que MD5 es un hash obsoleto para fines criptográficos (como verificar la autenticidad del archivo de una fuente que no es de confianza) y debe reemplazarse con algo mejor en la mayoría de los casos, como SHA-1. Para fines no criptográficos, como verificar la integridad del archivo entre dos fuentes de confianza, MD5 sigue siendo adecuado.
¿Por qué querrías hacer eso? – AndiDog
Para calcular valores MD5 para archivos que son demasiado grandes para caber en la memoria – channel72
MD5 solo tiene un estado de 128 bits que rastrea un fragmento de archivo de 512 bits durante el cálculo; a quién le importa qué tan grande es el archivo? –