[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;//自定义缓冲区大小16Kbyte[] 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){//计算MD5hashAlgorithm.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();}
结果:
转载请注明出处!!
[C#] 计算大文件的MD5的两种方式(直接调用方法计算,流计算-适用于大文件)相关推荐
- 原生态的ajax如何上传文件,原生ajax和iframe框架实现图片文件上传的两种方式
大家应该可以举出几种常用的异步文件上传功能的实现方式,使用频率较多的有原生ajax和iframe框架,实现图片文件上传,下面就为大家分享图片文件上传的两种方式:原生ajax和iframe框架,供大家参 ...
- python实现selenium文件上传的两种方式
方法一.input标签上传 如果是input标签,可以直接输入路径,那么可以直接调用send_keys输入路径. 方法二.非input标签上传 这种上传方式需要借助第三方工具,主要有以下三种情 ...
- 用CSV文件读写数据的两种方式(转)
导读:有时候我们需要对收集的数据做统计,并在页面提供显示以及下载.除了对传统的excel存取之外,对CSV文件的存取也很重要.本文列出了这两种操作的详细代码. 代码: <?php $file = ...
- android文件追加,Android 写文件 复写和追加 两种方式
/** * 此方法为android程序写入sd文件文件,用到了android-annotation的支持库@ * * @param buffer 写入文件的内容 * @param folder 保存文 ...
- Android中通过数组资源文件xml与适配器两种方式给ListView列表视图设置数据源
场景 实现效果如下 注: 博客: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 获取编程相关电子书.教程推送与免费下载. 实现 将布局改 ...
- Java计算两点间经纬度距离(两种方式)
反余弦计算方式: private static final double EARTH_RADIUS = 6371000; // 平均半径,单位:m:不是赤道半径.赤道为6378左右 public st ...
- vue前端上传文件给后端的两种方式
<a-uploadv-model:file-list="fileList":show-upload-list="false":multiple=" ...
- java 文件压缩zip【两种方式】
一.普通方式 package com.hebta.source.code.util;import java.io.*; import java.util.zip.ZipEntry; import ja ...
- Java生成MD5的两种方式
1 原生的 package com.pibigstar.common.utils;import java.security.MessageDigest;/*** MD5加密工具类* @author p ...
- 经纬度计算距离公式 java_Java计算两点间经纬度距离(两种方式)
反余弦计算方式: private static final double EARTH_RADIUS = 6371000; // 平均半径,单位:m:不是赤道半径.赤道为6378左右 public st ...
最新文章
- 【微信小程序】根据当前运行环境调用不同的接口地址的一些方法
- 都已经十岁的 Apache Dubbo,还能再乘风破浪吗?
- Python的小特别
- BZOJ 2097 [Usaco2010 Dec]Exercise 奶牛健美操
- CSS清除默认样式,成功入职腾讯
- redis缓存雪崩,缓存穿透,缓存击穿的解决方法
- 实现一维卷积神经网络
- c语言设计题库及详解答案,c语言程序设计题库及其答案
- java debug命令详解_DEBUG命令使用解析及范例大全
- w10如何共享计算机硬盘,Win10如何设置局域网磁盘共享?操作方法分享
- GBASE应用 | “天擎”出鞘 GBase 8a助力气象行业进入大数据时代
- python任务栏都隐藏了_如何隐藏PyQt4 Python应用程序的任务栏图标?
- JavaCV开发详解之1:调用本机摄像头并预览摄像头图像画面视频(建议使用javaCV最新版本)
- 微信开发获取签名wx.config
- 计算机网络复习-典型题目答案
- 安装主机及服务器系统
- 2020年黄历表_老黄历2020黄道吉日一览表-万年历老黄历2020年黄道吉日查询【蜜匠婚礼】...
- 2022-05-18 牛客网每日选择题--前端
- 基于java的springboot疫情下社区健康评估系统毕业设计springboot开题报告
- 最长不重复子串(java)