MD5码计算

在文件上传或下载过程中,通过计算MD5码可以验证文件传输的准确性。由于不同文件的MD5码独特且计算不可逆,这一方法被广泛采用。在传输前,先计算文件的MD5码,然后与文件一起发送。接收方接收到文件和MD5码后,重新计算文件的MD5码,对比两者一致则表明文件传输无误。对于大文件,可以采用分块计算MD5码并报告进度的方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 通过网路上传或下载文件时,需要对文件进行验证是否传输正确,这可以通过MD5码实现。

不同的文件产生的MD5码是不同的,并且MD5码的计算是不可逆的。

假设要通过网络传输一个文件,在传输之前先计算出MD5码,将文件和MD5码一起发送出去。

接收端收到文件和MD5码以后,对文件再次计算MD5码,若两个MD5码相同证明文件传输正确。

具体计算方法:

/// <summary>

        /// /// 计算文件的MD5校验
        /// /// </summary> 
        /// /// <param name="fileName">文件路径</param> 
        ///  <returns>MD5码</returns>
        private string GetMD5HashFromFile(string fileName)
        {
            try
            {
                FileStream file = new FileStream(fileName, FileMode.Open);
                System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
                byte[] retVal = md5.ComputeHash(file); //ComputeHash可按固定大小字节进行,这样就可以报告进度
                //md5 .
                file.Close();
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < retVal.Length; i++)
                {
                    sb.Append(retVal[i].ToString("x2"));
                }
                return sb.ToString();
            }
            catch (Exception ex)
            {
                throw new Exception("GetMD5HashFromFile() fail,error:" + ex.Message);
            }
        }

若文件比较大如1G 2G计算文件的过程会比较长 若希望得到MD5码的计算进度,可以用下面这种分块计算的方法,

块的大小自己根据需要调节,每计算完一块向外汇报一次进度即可。

        /// <summary>
        /// 分块计算MD5码
        /// </summary>
        /// <param name="filename">文件路径</param>
        /// <returns>MD5码</returns>
        private string GetMD5HashFromFilePart(string filename)
        {
            FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read);
            int bufferSize = 1048576; // 缓冲区大小,1MB 
            byte[] buff = new byte[bufferSize];


            MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
            md5.Initialize();


            long offset = 0;
            while (offset < fs.Length)
            {
                long readSize = bufferSize;
                if (offset + readSize > fs.Length)
                {
                    readSize = fs.Length - offset;
                }


                fs.Read(buff, 0, Convert.ToInt32(readSize)); // 读取一段数据到缓冲区 


                if (offset + readSize < fs.Length) // 不是最后一块 
                {
                    md5.TransformBlock(buff, 0, Convert.ToInt32(readSize), buff, 0);
                }
                else // 最后一块 
                {
                    md5.TransformFinalBlock(buff, 0, Convert.ToInt32(readSize));
                }


                offset += bufferSize;//在这里汇报进度即可
            }


            fs.Close();
            byte[] result = md5.Hash;
            md5.Clear();


            StringBuilder sb = new StringBuilder(32);
            for (int i = 0; i < result.Length; i++)
            {
                sb.Append(result[i].ToString("X2"));
            }
            return sb.ToString();
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值