最近,在项目中,需要计算文件的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值。