md5算法,如果对一个文件生成md5

zrdongjiao 2013-12-19 09:25:04
那么,这个算法是不是对整个文件扫描一遍?

如果整个文件扫描的话,那岂不是很慢,很耗时?
...全文
355 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
ForestDB 2013-12-25
  • 打赏
  • 举报
回复
# time dd if=/dev/urandom ibs=1M count=5 | md5sum 5+0 records in 10240+0 records out c70b84415e6dd943ef1054f4cfdc5839 - 5242880 bytes (5.2 MB) copied, 0.705356 seconds, 7.4 MB/s real 0m0.759s user 0m0.012s sys 0m0.708s # time dd if=/dev/urandom ibs=1M count=50 | md5sum 50+0 records in 102400+0 records out 52428800 bytes (52 MB) copied, 7.16639 seconds, 7.3 MB/s 459e2d00b5a06761316caa9093d40b5e - real 0m7.184s user 0m0.060s sys 0m6.920s # time dd if=/dev/urandom ibs=1M count=500 | md5sum 500+0 records in 1024000+0 records out 524288000 bytes (524 MB) copied, 69.3534 seconds, 7.6 MB/s 488c72f1c1e3df27535fc04082902eec - real 1m9.362s user 0m0.524s sys 1m7.668s LZ可以猜猜,如果count继续变大,要算个MD5要多久?
ForestDB 2013-12-25
  • 打赏
  • 举报
回复
顶16L,LZ确实想多了。 buffer为1024也许效率不是最高,那多少最高呢? LZ可以自己先想想。 我的答案是,设置成和底层的disk io的一次读的buffer的大小一致,效率最好。 其实对待这个问题,最简单的方式就是先功能,后性能;在功能保证的前提下profile,调优。 而且就MD5来说,问题不在于计算,而是要读50G这么大的文件,天生磁盘IO就很大。
奔跑的大象 2013-12-25
  • 打赏
  • 举报
回复
楼主想多了,
yjz_uestc 2013-12-25
  • 打赏
  • 举报
回复
引用 10 楼 ForestDB 的回复:
int MD5_Init(MD5_CTX *c); int MD5_Update(MD5_CTX *c, const void *data, unsigned long len); int MD5_Final(unsigned char *md, MD5_CTX *c); 基本操作就是: MD5_CTX c; MD5_Init(&c); // 初始化上下文 char buffer[1024]; // 定义一小块buffer,文件会读入此buffer while (read_1024_byte_of_file_into_buffer()) // 反复读文件内容,只到文件全部读完 MD5_Update(&c, buffer, 1024) // 用每次读到的内容去update md5上下文 char md5_digest[64]; MD5_Final(md5_digest, &c); // 从上下文中提取md5 上述的核心就是while循环,每次读一部分文件,然后根据读到的内容更新MD5值,如此反复,直至全部文件结束。
buffer小心为1024是否合适呢?可能不是效率最高吧
qq120848369 2013-12-20
  • 打赏
  • 举报
回复
还真不慢,50M/S还不够你读的吗。
Meteor_Code 2013-12-20
  • 打赏
  • 举报
回复
反正你眨一下眼睛就可以扫描好几次了
zhuobattle 2013-12-20
  • 打赏
  • 举报
回复
如果是几G的文件,还是要点时间的。
max_min_ 2013-12-19
  • 打赏
  • 举报
回复
do it! you will know the truth
帅得不敢出门 2013-12-19
  • 打赏
  • 举报
回复
linux md5sum 有源码
ForestDB 2013-12-19
  • 打赏
  • 举报
回复
是 没你想的慢,比你想的快多了。
赵4老师 2013-12-19
  • 打赏
  • 举报
回复
能耗多少时间?50MB/s ?
5t4rk 2013-12-19
  • 打赏
  • 举报
回复
要不然你MD5计算的是什么呢。
昵称很不好取 2013-12-19
  • 打赏
  • 举报
回复
需要的,文件中即使多一个空格,md5码也会不一样
「已注销」 2013-12-19
  • 打赏
  • 举报
回复
必须将整个文件从头到尾读一遍。
图灵狗 2013-12-19
  • 打赏
  • 举报
回复
当然要整个文件扫描,不会很慢。
引用 楼主 zrdongjiao 的回复:
那么,这个算法是不是对整个文件扫描一遍? 如果整个文件扫描的话,那岂不是很慢,很耗时?
389158812 2013-12-19
  • 打赏
  • 举报
回复
整个读取必须的
ForestDB 2013-12-19
  • 打赏
  • 举报
回复
int MD5_Init(MD5_CTX *c); int MD5_Update(MD5_CTX *c, const void *data, unsigned long len); int MD5_Final(unsigned char *md, MD5_CTX *c); 基本操作就是: MD5_CTX c; MD5_Init(&c); // 初始化上下文 char buffer[1024]; // 定义一小块buffer,文件会读入此buffer while (read_1024_byte_of_file_into_buffer()) // 反复读文件内容,只到文件全部读完 MD5_Update(&c, buffer, 1024) // 用每次读到的内容去update md5上下文 char md5_digest[64]; MD5_Final(md5_digest, &c); // 从上下文中提取md5 上述的核心就是while循环,每次读一部分文件,然后根据读到的内容更新MD5值,如此反复,直至全部文件结束。
zrdongjiao 2013-12-19
  • 打赏
  • 举报
回复
引用 3 楼 thefirstz 的回复:
需要的,文件中即使多一个空格,md5码也会不一样
引用 6 楼 ForestDB 的回复:
是 没你想的慢,比你想的快多了。
是否得开一个很大的缓冲区域,读取整个文件,进行计算? 比如几十g的电影,如何计算呢?

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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