
对于用户上传的文件,是否要考虑 两个用户上传了不同的文件但 MD5 冲突的情况?
/files/49/49f68a5c8493ec2c0bf489821c21fc3b.png
1 killergun 2020-12-08 16:32:54 +08:00 文件名再加个用户信息区分? |
2 maichael 2020-12-08 16:33:53 +08:00 看有没有删除文件和剪切文件的需求 |
3 Licsber 2020-12-08 16:37:39 +08:00 都用 md5 了 为啥不用 uuid ? |
4 imdong OP |
5 3dwelcome 2020-12-08 16:56:27 +08:00 强迫症患者表示,写个 VFS 不香吗?服务器一堆小文件,等到要异地备份的时候,完全受不了。 |
6 imn1 2020-12-08 17:10:44 +08:00 这个其实看需求,用 md5 命名,我觉得最主要是,不需要另外搞个数据库保存文件 md5 值 怕不同文件但 md5 冲突,就加个字段呗,例如字节数、抽固定几个字节 base64/md5 作为二步校验 我觉得在出现冲突时才考虑加上就够了,不必所有文件预先加上 |
7 用对象存储 |
9 Vegetable 2020-12-08 17:58:42 +08:00 你这个可能不如另一个问题明显: 用户把同一个文件用两个不同的名字传上来,咋办呢 |
10 14v45mJPBYJW8dT7 2020-12-08 17:59:47 +08:00 如果能做到可能哈希冲突的数量级,直接用第三方对象存储就行了,不会差钱的。 |
11 vance123 2020-12-08 18:02:38 +08:00 不考虑攻击的话, 百亿级的文件数量, md5 冲突概率小于 1e-18 |
12 imdong OP |
13 Mithril 2020-12-08 18:40:00 +08:00 摘要其实是不靠谱的,他的作用是在一定可靠程度下去验证两个东西是不是同一个,而这可靠程度只要你碰到了就是确定的。 所以你不能靠摘要去给用户文件去重,只能后台完全比较。不然很容易就像之前 SHA 那样两个 PDF 一样。这东西人为制造一个碰撞很难,但是你没法保证用户上传的不碰撞。到时候没法跟用户解释你就是那 1%。你自己上传的照片为什么变成了冠希。 个人建议,上传直接 UUID,同时另存一份摘要。然后后台跑个程序定期对摘要相同的文件做完整比较,如果完全一样那么直接把另一个文件在数据库里记录的 UUID 替掉。 当然这是不考虑删除的情况。 |
14 msg7086 2020-12-09 00:40:32 +08:00 不考虑攻击的话,MD5 碰撞概率真的太小了。 如果真的不放心,可以补一个别的 Hash 算法,比如说 MD5+XXH128,那要是能被攻破了,就能写论文发表了。 |
15 msg7086 2020-12-09 00:50:16 +08:00 @Mithril 1%是不是有点过分了,128bit Hash 的空间,0.000000001%还差不多,几千亿个文件能撞上一次的概率都微不足道。如果是淘宝这个体量,是要考虑碰撞的,但是普通人连下辈子转生了都不一定能遇上一次随机 MD5 碰撞。 现在的 MD5 碰撞,也是密码学攻击碰撞而不是随机 Hash 空间内碰撞。 |
16 lxilu 2020-12-09 19:20:34 +08:00 MD5 已知能构造碰撞,肯定有人攻击啊!你也不是非 MD5 不可吧 |
17 JinTianYi456 2020-12-11 11:23:56 +08:00 |