Sto provando a progettare una semplice applicazione da utilizzare per il calcolo di un file CRC32/md5/sha1/sha256/sha384/sha512, e ho incontrato un po 'di un roadblock. Questo è stato fatto in C#.Come hash un singolo file in più modi contemporaneamente?
Mi piacerebbe essere in grado di farlo nel modo più efficiente possibile, quindi il mio pensiero originale era quello di leggere il file in un memorystream prima di elaborare, ma ho presto scoperto che file molto grandi mi causano l'esaurimento della memoria molto velocemente. Quindi sembrerebbe che io debba usare un filestream. Il problema, a mio avviso, è che è possibile eseguire solo una funzione di hash alla volta, e così facendo con un filestream ci vorrà un po 'per completare ogni hash.
Come potrei andare a leggere un piccolo frammento di un file in memoria, elaborarlo con tutti e 6 gli algoritmi e poi andare su un altro blocco ... O l'hashing non funziona in questo modo?
Questo era il mio tentativo originale di leggere un file in memoria. Non è riuscito quando ho provato a leggere un'immagine CD in memoria prima di eseguire gli algoritmi di hashing sulla MemoryStream: algoritmi
private void ReadToEndOfFile(string filename)
{
if (File.Exists(filename))
{
FileInfo fi = new FileInfo(filename);
FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read);
byte[] buffer = new byte[16 * 1024];
//double step = Math.Floor((double)fi.Length/(double)100);
this.toolStripStatusLabel1.Text = "Reading File...";
this.toolStripProgressBar1.Maximum = (int)(fs.Length/buffer.Length);
this.toolStripProgressBar1.Value = 0;
using (MemoryStream ms = new MemoryStream())
{
int read;
while ((read = fs.Read(buffer, 0, buffer.Length)) > 0)
{
ms.Write(buffer, 0, read);
this.toolStripProgressBar1.Value += 1;
}
_ms = ms;
}
}
}
Ho provato a farlo funzionare con MD5 e il programma viene eseguito, anche se sembra che generi hash non corretti. Ecco un collegamento al mio codice: [collegamento] (http://pastebin.com/i3iPwYZv) – agent154
Si dovrebbe usare 'read' invece di' buffer.Length' quando si chiama 'TransformFinalBlock' –
Grazie mille! La notte scorsa stavo tormentando per un po '. Finito per hacking insieme qualcosa di stupido cercando di farlo funzionare, ma non ho potuto fare a meno di sentire che non era necessario. Ho scoperto che era perché l'ultimo array veniva letto completamente anche quando l'ultimo blocco era troppo piccolo per questo. Ho finito per creare un nuovo array di byte per l'ultimo pezzo a parità di dimensioni dell'ultimo blocco. – agent154