[C#] 計算大檔案的MD5的兩種方式(直接呼叫方法計算,流計算-適用於大檔案)
阿新 • • 發佈:2019-02-07
通過.NET中的預設類實現,但是採用不同類,針對不同的情況:
具體如下:
類:
/// <summary> /// 檔案MD5操作類 /// </summary> public class MD5Checker { /// <summary> /// 通過MD5CryptoServiceProvider類中的ComputeHash方法直接傳入一個FileStream類實現計算MD5 /// 操作簡單,程式碼少,呼叫即可 /// </summary> /// <param name="path">檔案地址</param> /// <returns>MD5Hash</returns> public static string getMD5ByMD5CryptoService(string path) { if (!File.Exists(path)) throw new ArgumentException(string.Format("<{0}>, 不存在", path)); FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read); MD5CryptoServiceProvider md5Provider = new MD5CryptoServiceProvider(); byte[] buffer = md5Provider.ComputeHash(fs); string resule = BitConverter.ToString(buffer); resule = resule.Replace("-", ""); md5Provider.Clear(); fs.Close(); return resule; } /// <summary> /// 通過HashAlgorithm的TransformBlock方法對流進行疊加運算獲得MD5 /// 實現稍微複雜,但可使用與傳輸檔案或接收檔案時同步計算MD5值 /// 可自定義緩衝區大小,計算速度較快 /// </summary> /// <param name="path">檔案地址</param> /// <returns>MD5Hash</returns> public static string getMD5ByHashAlgorithm(string path) { if (!File.Exists(path)) throw new ArgumentException(string.Format("<{0}>, 不存在", path)); int bufferSize = 1024 * 16;//自定義緩衝區大小16K byte[] buffer = new byte[bufferSize]; Stream inputStream = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.Read); HashAlgorithm hashAlgorithm = new MD5CryptoServiceProvider(); int readLength = 0;//每次讀取長度 var output = new byte[bufferSize]; while ((readLength = inputStream.Read(buffer, 0, buffer.Length)) > 0) { //計算MD5 hashAlgorithm.TransformBlock(buffer, 0, readLength, output, 0); } //完成最後計算,必須呼叫(由於上一部迴圈已經完成所有運算,所以呼叫此方法時後面的兩個引數都為0) hashAlgorithm.TransformFinalBlock(buffer, 0, 0); string md5 = BitConverter.ToString(hashAlgorithm.Hash); hashAlgorithm.Clear(); inputStream.Close(); md5 = md5.Replace("-", ""); return md5; } }
測試:
static void Main(string[] args) { Console.WriteLine("第一種方式:"); Console.WriteLine(DateTime.Now.Ticks); Console.WriteLine(DateTime.Now.ToString()); Console.WriteLine(MD5Checker.getMD5ByMD5CryptoService(@"D:\ShareFiles\Softwares\Office2013.zip")); Console.WriteLine(DateTime.Now.Ticks); Console.WriteLine(DateTime.Now.ToString()); Console.WriteLine("第二種方式:"); Console.WriteLine(DateTime.Now.Ticks); Console.WriteLine(DateTime.Now.ToString()); Console.WriteLine(MD5Checker.getMD5ByHashAlgorithm(@"D:\ShareFiles\Softwares\Office2013.zip")); Console.WriteLine(DateTime.Now.Ticks); Console.WriteLine(DateTime.Now.ToString()); Console.ReadKey(); }
結果:
轉載請註明出處!!