上一主题下一主题
关键字
主题 : 对多个文件的 MD5 进行合并再进行 MD5 的结果, 依然唯一吗?
级别: 北风技术菜鸟


UID: 472121
精华: 0
发帖: 1690
威望: 5139 点
学点: 4028 点
贡献: 177 点
好评: 0 点
学币: 14 个
注册时间: 2014-07-08
最后登录: 2015-04-04
楼主  发表于: 2015-03-14 15:17||

对多个文件的 MD5 进行合并再进行 MD5 的结果, 依然唯一吗?

这样一个需求, 有文件 a.html b.css, a 当中有 b 的依赖. ^| L@f  
然后上线了, 为了**** CDN, 我们调整文件名 a.<md5>.html, b.<md5>.html. SnsOuC5Ah  
这时候比如说 b 变了, 那么 b.md5.css 这个也变了, 实际上, a.<md5>.html 也变了. Z?yMy zT  
因为 a 相当于引用了一个 b 的文件名, 而 b 的文件名因为内容改了也就变了... zrWkz3FN  
我们使用 md5 就是为了文件内容唯一.. og<mFbqkq7  
AV\6K;~  
然后, 这样递归生成 md5 压力比较大, 我考虑这样一个策略, eHUr!zH:  
不是把 b.<md5>.css 替换进 a 再去计算 a 的 md5, *5'U3py  
而是把 a 的 md5 加上 b 修改了名字之后的 md5. 两个 md5 一起生成新的 md5. spIkXEK  
用这样的方案进行上线, 静态资源是否还能保持唯一呢?
此帖悬赏中(剩余时间:已结束)...
最佳答案: 2 学点
热心助人剩余点数: 1 学点
级别: 北风资深评论员


UID: 471051
精华: 0
发帖: 5449
威望: 7518 点
学点: 8435 点
贡献: 216 点
好评: 0 点
学币: 116 个
注册时间: 2014-07-03
最后登录: 2015-04-06
沙发(1楼)  发表于: 2015-03-14 15:19||

好奇怪,你听谁说的MD5能保证唯一?
级别: 北风资深评论员


UID: 471051
精华: 0
发帖: 5449
威望: 7518 点
学点: 8435 点
贡献: 216 点
好评: 0 点
学币: 116 个
注册时间: 2014-07-03
最后登录: 2015-04-06
板凳(2楼)  发表于: 2015-03-14 15:19||

这不是循环了么? }z wX  
<#y*h8IZ@t  
其实,直接构建的时候拉git的commit hash就好了,直接截取前半部分的话还具备天然的从  MGQ,\55"  
构建后的文件名找对应的commit的功能,多好
级别: 北风资深评论员


UID: 471051
精华: 0
发帖: 5449
威望: 7518 点
学点: 8435 点
贡献: 216 点
好评: 0 点
学币: 116 个
注册时间: 2014-07-03
最后登录: 2015-04-06
地板(3楼)  发表于: 2015-03-14 15:19||

这要看你的md5值是用来****什么的。从你描述的情况来看,文件名里的md5只是为了保证文件被更改后产生一个新的文件名来使强制cdn刷新。md5值本身并不用来****验证,那么你说的方法是可行的。 6vmkDL8{A8  
P+]39p{  
但是用你的方法会有几个问题: $<T)_g  
8rw;Yo<k  
如果b改回去了,b的文件名会被改回去,理论上a的文件名也应该改回去,但用你的方法虽然a的内容没变(被改回去了)但是文件名上的md5却变了。所以会出现文件名不同但内容相同的情况。 esxU44  
AU)Qk$c  
如果a有两个依赖b和c。当b,c都改动的时候,md5(md5(a)+md5(b)+md5(c))和md5(md5(a)+md5(c)+md5(b))是不一样的,取决于顺序。这其实不会影响你的目的(使文件名发生改动),但看上去怪怪的。 |>p\*Dl}H  
B-Fu/n  
文件名不可预测。 <6Br]a60RR  
[5:F  
其实算MD5很快,而且只是发布的时候****一次功而已,不用搞这么复杂。