Estoy tratando de diseñar una aplicación simple que se utilizará para calcular un archivo CRC32/md5/sha1/sha256/sha384/sha512, y me he encontrado con un obstáculo. Esto se está haciendo en C#.¿Cómo hash un único archivo de varias maneras al mismo tiempo?
Me gustaría poder hacer esto de la manera más eficiente posible, así que mi idea original fue leer el archivo en una corriente de memoria antes del procesamiento, pero pronto descubrí que los archivos muy grandes me hacían falta memoria muy rápidamente. Entonces parece que tengo que usar un filestream en su lugar. El problema, según lo veo, es que solo se puede ejecutar una función hash a la vez, y hacerlo con una cadena de archivos tardará un tiempo en completarse.
¿Cómo puedo leer un pequeño archivo en la memoria, procesarlo con los 6 algoritmos y luego ir a otro fragmento ... O el hash no funciona de esa manera?
Este fue mi intento original de leer un archivo en la memoria. Fracasó cuando traté de leer una imagen de CD en la memoria antes de ejecutar los algoritmos hash en la MemoryStream: algoritmos
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;
}
}
}
He intentado hacer que esto funcione con MD5, y el programa se ejecuta, aunque parece que está generando valores hash incorrectos. Aquí hay un enlace a mi código: [link] (http://pastebin.com/i3iPwYZv) – agent154
Deberías usar 'read' en lugar de' buffer.Length' cuando llamas 'TransformFinalBlock' –
¡Muchas gracias! Estaba angustiado por esto por un tiempo anoche. Terminé pirateando algo estúpido buscando que funcionara, pero no pude evitar sentir que era innecesario. Descubrí que era porque el último conjunto se estaba leyendo completamente, incluso cuando el último fragmento era demasiado pequeño para él. Terminé creando una nueva matriz de bytes para que la última pieza igualara el tamaño del último fragmento. – agent154