是否应该用文件 MD5 作为文件名? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
imdong
V2EX    问与答

是否应该用文件 MD5 作为文件名?

  •  
  •   imdong 2020-12-08 16:31:10 +08:00 3631 次点击
    这是一个创建于 1847 天前的主题,其中的信息可能已经有所发展或是发生改变。

    对于用户上传的文件,是否要考虑 两个用户上传了不同的文件但 MD5 冲突的情况?

    /files/49/49f68a5c8493ec2c0bf489821c21fc3b.png

    17 条回复    2020-12-11 11:23:56 +08:00
    killergun
        1
    killergun  
       2020-12-08 16:32:54 +08:00
    文件名再加个用户信息区分?
    maichael
        2
    maichael  
       2020-12-08 16:33:53 +08:00
    看有没有删除文件和剪切文件的需求
    Licsber
        3
    Licsber  
       2020-12-08 16:37:39 +08:00
    都用 md5 了 为啥不用 uuid ?
    imdong
        4
    imdong  
    OP
       2020-12-08 16:38:55 +08:00
    @killergun 如果要考虑 MD5 冲突的话,可能加用户信息不如加时间戳?

    @maichael 暂时计划软删除,而且图片多为 UGC 内容,连带删除可能性不大,数据库有记录文件被使用信息。
    3dwelcome
        5
    3dwelcome  
       2020-12-08 16:56:27 +08:00
    强迫症患者表示,写个 VFS 不香吗?服务器一堆小文件,等到要异地备份的时候,完全受不了。
    imn1
        6
    imn1  
       2020-12-08 17:10:44 +08:00
    这个其实看需求,用 md5 命名,我觉得最主要是,不需要另外搞个数据库保存文件 md5 值
    怕不同文件但 md5 冲突,就加个字段呗,例如字节数、抽固定几个字节 base64/md5 作为二步校验
    我觉得在出现冲突时才考虑加上就够了,不必所有文件预先加上
    huobazi
        7
    huobazi  
       2020-12-08 17:30:12 +08:00
    用对象存储
    lxilu
        8
    lxilu  
       2020-12-08 17:56:53 +08:00
    不要 MD5,实现碰撞很多年了 /t/169241
    Vegetable
        9
    Vegetable  
       2020-12-08 17:58:42 +08:00
    你这个可能不如另一个问题明显:
    用户把同一个文件用两个不同的名字传上来,咋办呢
    14v45mJPBYJW8dT7
        10
    14v45mJPBYJW8dT7  
       2020-12-08 17:59:47 +08:00
    如果能做到可能哈希冲突的数量级,直接用第三方对象存储就行了,不会差钱的。
    vance123
        11
    vance123  
       2020-12-08 18:02:38 +08:00
    不考虑攻击的话, 百亿级的文件数量, md5 冲突概率小于 1e-18
    imdong
        12
    imdong  
    OP
       2020-12-08 18:33:46 +08:00
    @Licsber 用 md5 实际上是想避免相同的文件存多份的。

    @3dwelcome 能力有限,直接用 OSS 了

    @imn1 文件没有存本地,所以没有能力判断冲突的文件是否相同。

    @huobazi 已经用上了,。

    @lxilu 如 11 楼 不考虑攻击的话,其实日常应该 概率不大?

    @Vegetable 针对的就是这种情况,用 md5 可避免,但是真正怕的是 md5 相同的两个不同的文件。

    @rimutuyuan 就是在 OSS 上了,所以又来问了。

    @vance123 有这个数字心理放心多了。

    感谢以上大佬们的回复,谢谢。
    Mithril
        13
    Mithril  
       2020-12-08 18:40:00 +08:00
    摘要其实是不靠谱的,他的作用是在一定可靠程度下去验证两个东西是不是同一个,而这可靠程度只要你碰到了就是确定的。
    所以你不能靠摘要去给用户文件去重,只能后台完全比较。不然很容易就像之前 SHA 那样两个 PDF 一样。这东西人为制造一个碰撞很难,但是你没法保证用户上传的不碰撞。到时候没法跟用户解释你就是那 1%。你自己上传的照片为什么变成了冠希。
    个人建议,上传直接 UUID,同时另存一份摘要。然后后台跑个程序定期对摘要相同的文件做完整比较,如果完全一样那么直接把另一个文件在数据库里记录的 UUID 替掉。
    当然这是不考虑删除的情况。
    msg7086
        14
    msg7086  
       2020-12-09 00:40:32 +08:00
    不考虑攻击的话,MD5 碰撞概率真的太小了。
    如果真的不放心,可以补一个别的 Hash 算法,比如说 MD5+XXH128,那要是能被攻破了,就能写论文发表了。
    msg7086
        15
    msg7086  
       2020-12-09 00:50:16 +08:00
    @Mithril 1%是不是有点过分了,128bit Hash 的空间,0.000000001%还差不多,几千亿个文件能撞上一次的概率都微不足道。如果是淘宝这个体量,是要考虑碰撞的,但是普通人连下辈子转生了都不一定能遇上一次随机 MD5 碰撞。
    现在的 MD5 碰撞,也是密码学攻击碰撞而不是随机 Hash 空间内碰撞。
    lxilu
        16
    lxilu  
       2020-12-09 19:20:34 +08:00
    MD5 已知能构造碰撞,肯定有人攻击啊!你也不是非 MD5 不可吧
    JinTianYi456
        17
    JinTianYi456  
       2020-12-11 11:23:56 +08:00
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3018 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 13:09 PVG 21:09 LAX 05:09 JFK 08:09
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86