2009-04-30 15 views
11

Estoy utilizando el código siguiente para calcular MD5SUM de un archivo -Computing MD5SUM de archivos de gran tamaño en C#

byte[] b = System.IO.File.ReadAllBytes(file); 
string sum = BitConverter.ToString(new MD5CryptoServiceProvider().ComputeHash(b)); 

Esto funciona bien con normalidad, pero si me encuentro con un archivo de gran tamaño (~ 1 GB) - por ejemplo, una imagen iso o un archivo VOB de DVD: obtengo una excepción de falta de memoria.

Sin embargo, puedo calcular el MD5SUM en cygwin para el mismo archivo en aproximadamente 10 segundos.

Sugiera cómo puedo hacer que funcione para archivos grandes en mi programa.

Gracias

Respuesta

29

sugiere emplear el método alternativo:

MD5CryptoServiceProvider.ComputeHash(Stream) 

y sólo tiene que pasar en un flujo de entrada abierta en su archivo. Es casi seguro que este método no lea todo el archivo en la memoria de una vez.

También me gustaría señalar que en la mayoría de las implementaciones de MD5 es posible agregar byte[] datos en la función de resumen un fragmento a la vez, y luego pedir el hash al final.

+3

Sí. Mono, de hecho, implementa ComputeHash (Stream) leyendo iterativamente en un byte [4096] (http://anonsvn.mono-project.com/viewvc/trunk/mcs/class/corlib/System.Security.Cryptography/HashAlgorithm.cs? revision = 107126 & view = markup). Esperaría que la implementación de MS sea muy similar. En general, usar ReadAllBytes probablemente significa que estás haciendo algo mal. Incluso para archivos cortos, usar un Stream es más elegante. –

+0

Esto es bastante dulce. Intenté soluciones simples de otras publicaciones sobre lectura en un flujo de memoria, etc., pero todas parecían fallar en archivos extremadamente grandes. Esto funciona perfectamente y es súper simple. Gracias :) – mrduclaw

Cuestiones relacionadas