2009-04-30 6 views
11

Sto usando seguente codice per calcolare MD5SUM di un file -Computing MD5SUM di file di grandi dimensioni in C#

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

Questo funziona bene normalmente, ma se ho incontrato un file di grandi dimensioni (~ 1 GB) - per esempio un'immagine ISO o un file VOB DVD - Ricevo un'eccezione Memoria esaurita.

Tuttavia, sono in grado di calcolare l'MD5SUM in cygwin per lo stesso file in circa 10 secondi.

Si prega di suggerire come posso farlo funzionare per file di grandi dimensioni nel mio programma.

Grazie

risposta

29

Io suggerisco di usare il metodo alternativo:

MD5CryptoServiceProvider.ComputeHash(Stream) 

e proprio passaggio in un flusso di ingresso aperto sul vostro file. Questo metodo sarà quasi certamente non letto nell'intero file in memoria in una volta.

Vorrei anche notare che nella maggior parte delle implementazioni di MD5 è possibile aggiungere i dati byte[] nella funzione digest un blocco alla volta, quindi chiedere l'hash alla fine.

+3

Sì. Mono implementa infatti ComputeHash (Stream) leggendo iterativamente in un byte [4096] (http://anonsvn.mono-project.com/viewvc/trunk/mcs/class/corlib/System.Security.Cryptography/HashAlgorithm.cs? revision = 107.126 & view = markup). Mi aspetto che l'attuazione della SM sia molto simile. Generalmente, l'uso di ReadAllBytes probabilmente significa che stai facendo qualcosa di sbagliato. Anche per i file brevi, l'utilizzo di uno stream è più elegante. –

+0

Questo è piuttosto dolce. Ho provato soluzioni semplici da altri post sulla lettura di un memorandum, ecc., Ma sembravano tutti fallire per file estremamente grandi. Funziona perfettamente ed è semplicissimo. Grazie :) – mrduclaw