Necesito calcular sumas de comprobación de archivos bastante grandes (gigabytes). Esto se puede lograr mediante el siguiente método:¿Es posible calcular hash MD5 (u otro) con lecturas almacenadas?
private byte[] calcHash(string file)
{
System.Security.Cryptography.HashAlgorithm ha = System.Security.Cryptography.MD5.Create();
FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read);
byte[] hash = ha.ComputeHash(fs);
fs.Close();
return hash;
}
Sin embargo, los archivos se escriben normalmente acaba de antelación y de manera tamponada (por ejemplo la escritura de 32MB a la vez). Estoy tan convencido de que vi una anulación de una función hash que me permitió calcular un hash MD5 (u otro) al mismo tiempo que la escritura, es decir: calcular el hash de un buffer, y luego alimentar el hash resultante en la siguiente iteración .
Algo como esto: (pseudo-ish)
byte [] hash = new byte [] { 0,0,0,0,0,0,0,0 };
while(!eof)
{
buffer = readFromSourceFile();
writefile(buffer);
hash = calchash(buffer, hash);
}
hash es ahora sililar con lo que se logra mediante la ejecución de la función calcHash sobre el archivo completo.
Ahora, no puedo encontrar ninguna anulación así en .Net Framework 3.5, ¿estoy soñando? ¿Nunca existió, o soy pésimo en la búsqueda? El motivo por el que se realizan cálculos tanto de escritura como de suma de comprobación de una vez es porque tiene sentido debido a los archivos de gran tamaño. Se espera que
omg, acaba de publicar la misma sugerencia, con el mismo formato =) –
Ok, pero +1 también proporciona una referencia! –
Ay caramba! ¡Ahí está! Esa era la función que estaba buscando. Es bueno saber que no estaba inventando todo. Gracias a Guffa y Rubens por proporcionar la respuesta correcta tan rápidamente. +1 a ambos, aceptaré esta respuesta debido al ejemplo de código incluido. –