最近,在項目中,需要計算文件的hash值來對文件進行最終校驗,在C#中,MD5、SHA256都是直接可用的。下面以MD5爲例,
一般來說,計算文件hash值時,是加載一個文件,然後來讀取並計算,如下:
MD5 md = MD5.Create();
buffer = Encoding.ASCII.GetBytes("abc");//這裏abc表示從文件中讀取的內容
md.TransformBlock(buffer, 0, buffer.Length, buffer, 0);
md.TransformFinalBlock(buffer, 0, 0);
Console.WriteLine(System.Convert.ToBase64String(md.Hash));
以上結算結果
kAFQmDzST7DWlj99KOF/cg==
對於這種方式,小文件來說還好,但是,當文件大小達到10GB左右時,計算耗時大概2Min左右,文件更大,則效果更差。因此,我們需要一種能夠實時計算的方式。
實時計算hash值,
我們期望,在記錄文件的過程中,直接計算hash值,等文件記錄完畢時,直接生成相應的文件hash值。
talk is cheap,show you code.
var buffer = new byte[0];
MD5 md5 = MD5.Create();
buffer = Encoding.ASCII.GetBytes("a");
md5.TransformBlock(buffer, 0, buffer.Length, buffer, 0);
buffer = Encoding.ASCII.GetBytes("b");
md5.TransformBlock(buffer, 0, buffer.Length, buffer, 0);
buffer = Encoding.ASCII.GetBytes("c");
md5.TransformBlock(buffer, 0, buffer.Length, buffer, 0);
md5.TransformFinalBlock(buffer, 0, 0);
Console.WriteLine(System.Convert.ToBase64String(md5.Hash));
kAFQmDzST7DWlj99KOF/cg==
至此,兩種方式結果相同,可知,可通過第二種方法來實時運用MD5等來計算hash值。