Ho bisogno di calcolare i checksum di file piuttosto grandi (gigabyte). Questo può essere realizzato utilizzando il seguente metodo:È possibile calcolare l'hash MD5 (o altro) con letture bufferizzate?
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;
}
Tuttavia, i file vengono normalmente scritte solo in anticipo in modo tamponata (per esempio la scrittura 32MB di alla volta). Sono così convinto di aver visto un override di una funzione di hash che mi ha permesso di calcolare un hash MD5 (o altro) nello stesso momento in cui scrivevo, cioè: calcolare l'hash di un buffer, quindi alimentare l'hash risultante nella successiva iterazione .
Qualcosa di simile a questo: (pseudocodice-ish)
byte [] hash = new byte [] { 0,0,0,0,0,0,0,0 };
while(!eof)
{
buffer = readFromSourceFile();
writefile(buffer);
hash = calchash(buffer, hash);
}
hash è ora sililar a quello che sarebbe stato realizzato eseguendo la funzione calcHash sull'intero file.
Ora, non riesco a trovare alcun override del genere in the.Net 3.5 Framework, sto sognando? Non è mai esistito, o sono solo pessimo a cercare? La ragione per eseguire contemporaneamente sia il calcolo della scrittura che del checksum è perché ha senso a causa dei file di grandi dimensioni.
omg, ho appena postato lo stesso suggerimento, usando la stessa formattazione =) –
Ok, ma +1 per fornire anche un riferimento! –
Ay caramba! Eccolo! Questa era la funzione che stavo cercando. Buono a sapersi non stavo inventando tutto. Grazie a Guffa e Rubens per aver fornito la risposta giusta così prontamente. A entrambi, accetterò questa risposta a causa dell'esempio di codice incluso. –