2011-05-18 22 views
6

Tengo un conjunto de datos grande (~ 1GB) almacenado en un formato de archivo personalizado, cuyos últimos 16 bytes son un hash MD5 de todos los bytes anteriores del archivo.Cálculo del hash MD5 de una secuencia parcial

Quiero verificar el MD5 de este archivo contra el MD5 incrustado utilizando HashAlgorithm.ComputeHash (Stream), sin embargo, esto calculará el hash de todo el archivo INCLUYENDO el hash en los últimos 16bytes, lo que obviamente no funcionará.

¿Cómo calculo el hash MD5 de PART de una secuencia? Sé que puedo leer la secuencia en una matriz y pasar esto a HashAlgorithm.ComputeHash (Bytes), sin embargo, la sobrecarga de duplicar este 1GB de datos en la memoria es prohibitiva.

+1

Tenga en cuenta que MD5 ya no es un algoritmo de hash seguro – oleksii

+0

Estoy usando esto solo para verificar que el archivo no se haya dañado en el disco o en la memoria, por lo que esto no es un problema. – Satellite

Respuesta

4

Tomado de here donde también puede obtener otras formas de hacerlo.

Realice una clase parcial de secuencia de archivos, lea el tamaño que desee y haga hash de la misma.

class PartialFileStream : FileStream 
{ 
    public PartialFileStream(string path, FileMode mode, long startPosition, long endPosition): base(path, mode) 
{ 
    base.Seek(startPosition, SeekOrigin.Begin); 
    ReadTillPosition = endPosition; 
} 

public long ReadTillPosition { get; set; } 

public override int Read(byte[] array, int offset, int count) 
{ 
if (base.Position >= this.ReadTillPosition) 
    return 0; 

if (base.Position + count > this.ReadTillPosition) 
    count = (int)(this.ReadTillPosition - base.Position); 

return base.Read(array, offset, count); 
    } 
} 
0

Puede utilizar la opción FileStream.Seek a buscar a una posición particular de la corriente y leer desde allí.

+0

Su problema es diferente: podría buscar, pero no quiere terminar el hash. Por supuesto, si el hash pudiera estar al principio del archivo, simplemente podría usar seek y hash el resto. – Euqil