为什么对整个文件流计算MD5比分块慢

c20110101 2011-12-22 03:24:50
计算一个文件的MD5和把文件分成n分,计算每块的MD5。为什么对文件流计算的还慢呢?
HMACSHA1 hmac = new HMACSHA1(BitConverter.GetBytes(HashKey[0]));
hashes = hmac.ComputeHash(data);//其中一个文件块,共n块

HMACSHA1 hmac2 = new HMACSHA1(BitConverter.GetBytes(HashKey[0]));
hashes = hmac2.ComputeHash(fstream); //计算文件流hmac值// 计算
...全文
359 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
c20110101 2011-12-27
  • 打赏
  • 举报
回复
分块的方法:我是每次读入一块,然后计算,再读入另一块。程序并没有使用多线程。
c20110101 2011-12-27
  • 打赏
  • 举报
回复
实际上分成n份,我是一块一块读入计算的。但是文件流的话,就是直接赋于流,计算的

using (BinaryReader binReader = new BinaryReader(File.Open(this.FileName, FileMode.Open)))
{
while (current < this.Count) //总共执行Count块
{
//计算当前块的BF
this.ComputeHash(binReader.ReadBytes(this.BlockSize), current);
current++;
}
}

我看了HMACSHA1这个函数实现,它好像每次是读入4kb,用于计算。不知是否这个原因。
铜臂阿铁木 2011-12-27
  • 打赏
  • 举报
回复
分成5块,是把文件分成了5份,分别用流读取?还是将五块都放在内存里了?如果放在内存里,必然比直接用流快,原因不说你也明白吧,一个读内存一个读磁盘。

如果分成5块,但是没放内存里,而是写成了5个文件,然后分别用stream读取,这时候还比直接用stream快,那我只能猜测是用了多线程了。
c20110101 2011-12-24
  • 打赏
  • 举报
回复
计算的数据量,都是文件大小
c20110101 2011-12-24
  • 打赏
  • 举报
回复
抱歉,意思没讲清楚。我的意思是,对文件分割n块后,计算了n块的MD5,反而比对文件直接计算1个MD5的时间短。
thy442030800 2011-12-22
  • 打赏
  • 举报
回复
对的。范围问题吧应该
铜臂阿铁木 2011-12-22
  • 打赏
  • 举报
回复
因为流要对整个文件进行摘要,而块摘要就是那一块而已。

110,571

社区成员

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

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

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