C#如何高效的计算文件的MD5值?

COCO49 2018-01-29 07:39:19
网上搜了一片,目前找到最快的是。
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;
}

有没有更快的?
...全文
2334 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
先确认你要计算Md5的文件有多大,如果很大,那估计要找其他方案,如果100m以内,我测试过,一百毫秒以内,不用担心效率问题
xuzuning 2018-01-30
  • 打赏
  • 举报
回复
你不是 计算文件的MD5值 吗?与 文件列表 有什么关系 如果你认为读取文件是瓶颈,那么可改用内存映射文件读取
weixin_41692798 2018-01-30
  • 打赏
  • 举报
回复
是计算一份文件列表的md5,这份文件列表里面有很多
日月路明 2018-01-30
  • 打赏
  • 举报
回复
可以把文件放在内存盘上,然后计算你MD5,这样可以显著提高速度
COCO49 2018-01-30
  • 打赏
  • 举报
回复
引用 7 楼 xuzuning 的回复:
是对 文件列表里面的每个文件分别生成 md5 吗? 显然是并行运行最快了 你的函数只是计算一个文件的 md5,虽然单体的效率也很重要
是的。读写飙到120Mb,实在是想不到还有什么办法能优化。并行太多读写会炸吧。
xuzuning 2018-01-30
  • 打赏
  • 举报
回复
是对 文件列表里面的每个文件分别生成 md5 吗? 显然是并行运行最快了 你的函数只是计算一个文件的 md5,虽然单体的效率也很重要
COCO49 2018-01-30
  • 打赏
  • 举报
回复
引用 4 楼 starfd 的回复:
先确认你要计算Md5的文件有多大,如果很大,那估计要找其他方案,如果100m以内,我测试过,一百毫秒以内,不用担心效率问题
不是的,说漏了。是计算一份文件列表的md5,这份文件列表里面有很多的文件路径。
COCO49 2018-01-30
  • 打赏
  • 举报
回复
引用 3 楼 xuzuning 的回复:
你不是 计算文件的MD5值 吗?与 文件列表 有什么关系 如果你认为读取文件是瓶颈,那么可改用内存映射文件读取
不是的,说漏了。是计算一份文件列表的md5,这份文件里面是很多的文件路径。
COCO49 2018-01-30
  • 打赏
  • 举报
回复
引用 1 楼 caozhy 的回复:
你测试下,计算的速度不可能比文件读取的速度更快。比如说在机械硬盘上,100~200MB是理论上限。如果和这个差不多(一个数量级以内)就已经很优化了。
这个代码CPU占7%,读写占100~120Mb 后来发现某程序CPU占12% 读写占40~50Mb 同样的文件列表,出结果的速度是上面那个代码的3到6倍。不知道怎么实现的。 估计是多线程?
threenewbee 2018-01-29
  • 打赏
  • 举报
回复
你测试下,计算的速度不可能比文件读取的速度更快。比如说在机械硬盘上,100~200MB是理论上限。如果和这个差不多(一个数量级以内)就已经很优化了。

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧