2011-05-18 158 views
6

我有一個以自定義文件格式存儲的大型數據集(〜1GB),其最後16個字節是文件所有先前字節的MD5哈希。計算部分流的MD5哈希值

我想使用HashAlgorithm.ComputeHash(Stream)來驗證這個文件的MD5對嵌入式MD5,但是這會計算整個文件的散列,包括最後16bytes中的散列,這顯然無法工作。

如何計算流的PART部分的MD5散列?我知道我可以將流讀入數組並將其傳遞給HashAlgorithm.ComputeHash(Bytes),但是在內存中複製這1GB數據的開銷是令人望而卻步的。

+1

請注意MD5不再是一個安全的哈希算法 – oleksii 2011-05-18 07:45:15

+0

我只用它來驗證該文件沒有在磁盤或內存中損壞,所以這不是一個問題。 – Satellite 2011-05-18 16:08:58

回答

4

取自here您還可以在其中找到其他方法。

創建一個部分文件流類,讀取您想要的大小並對其進行散列。

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

您可以使用FileStream.Seek選項來查找流的特定位置並從那裏讀取。

+0

他的問題是不同的 - 他可以尋求,但他不想散列流的末尾。當然,如果散列可以在文件的開頭,他可以使用seek並散列其餘部分。 – Euqil 2011-05-18 07:24:54