1. 程式人生 > >[C#] 計算大檔案的MD5的兩種方式(直接呼叫方法計算,流計算-適用於大檔案)

[C#] 計算大檔案的MD5的兩種方式(直接呼叫方法計算,流計算-適用於大檔案)

通過.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();
        }

結果:


轉載請註明出處!!