V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xing393939
V2EX  ›  PHP

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

  •  
  •   xing393939 · 2015-12-08 14:25:40 +08:00 · 4156 次点击
    这是一个创建于 3064 天前的主题,其中的信息可能已经有所发展或是发生改变。
    如果先合并再计算,耗时很长。。。不知道能不能不合并就计算出来呢






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

    记错了, 当时是给文件夹压缩, 然后求 md5, 这样和文件夹中的文件时间有关系
    50vip
        13
    50vip  
       2015-12-08 19:52:32 +08:00
    可以的, update 就可以了, http://www.atool.org/file_hash.php 这个使用 js worker 做的,也是每次都一部分进行计算,以节约内存。
    wizardoz
        14
    wizardoz  
       2015-12-08 20:44:33 +08:00
    如果文件只是简单的连接,那么不合并计算和合并计算是一样的。
    md5 算法是支持流输入的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2888 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 14:50 · PVG 22:50 · LAX 07:50 · JFK 10:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.