1000 个 4M 文件,如何计算合并之后的文件 MD5 值效率高?

2015-12-08 14:25:40 +08:00
 xing393939
如果先合并再计算,耗时很长。。。不知道能不能不合并就计算出来呢






.
4164 次点击
所在节点    PHP
14 条回复
gam2046
2015-12-08 14:32:55 +08:00
建议你看一下 MD5 的算法,他是分组进行计算的,因此计算过程中不要求你文件的连续性,即使你是连续的文件,在计算散列值的时候,依旧要拆分成一个个块,分别计算。
loqixh
2015-12-08 14:33:36 +08:00
当然可以,用 MD5_Update
allan888
2015-12-08 14:35:16 +08:00
你把 4 个文件当成一个连续的文件看就得了。
“ MD5 中的任意第 i 个分组,每次运算都由前一轮的 128 位结果值和第 i 块 512bit 值进行运算”
你要做的就是每次输入下一部分数据的时候如果第一个文件结束了就用下一个续上而已。。。
loqixh
2015-12-08 14:40:41 +08:00
查了下, php 是这样, 5.5 以上 crypto.createHash('md5').update("123456")
h4x3rotab
2015-12-08 16:20:44 +08:00
cat *.txt | md5 > output.txt
h4x3rotab
2015-12-08 16:21:40 +08:00
我错了,没看是 php 版。那就是 update 了。
xing393939
2015-12-08 17:20:07 +08:00
感谢,已找到方法
xing393939
2015-12-08 17:20:14 +08:00
$ctx = hash_init('md5');
foreach ($array as $fileArr) {
hash_update_file($ctx, "{$dir}/{$fileArr[0]}");
}
return hash_final($ctx);
likebeta
2015-12-08 18:48:11 +08:00
貌似不行吧, 和文件时间也有关系吧, 合并后时间变化了
lhbc
2015-12-08 18:50:23 +08:00
@likebeta 时间是文件系统的,和文件内容无关。
Citrus
2015-12-08 19:08:01 +08:00
@likebeta md5 只关注内容,除了内容以外的所有东西随便改不会变化。
likebeta
2015-12-08 19:32:18 +08:00
@lhbc
@Citrus

记错了, 当时是给文件夹压缩, 然后求 md5, 这样和文件夹中的文件时间有关系
50vip
2015-12-08 19:52:32 +08:00
可以的, update 就可以了, http://www.atool.org/file_hash.php 这个使用 js worker 做的,也是每次都一部分进行计算,以节约内存。
wizardoz
2015-12-08 20:44:33 +08:00
如果文件只是简单的连接,那么不合并计算和合并计算是一样的。
md5 算法是支持流输入的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/241984

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX