Java/zip:为什么 .jar 文件的创建是不确定的?
我从未真正研究过它,但现在我意识到我无法轻松构建两个相同的 .jar 文件。
我的意思是,如果我构建两次,而不更改任何内容,我会得到完全相同的大小,但 .jar 的校验和不同。
因此,我快速运行了一些测试(基本上是解压缩、sort -n -k 5'ing,然后diff'ing)以查看所有.jar 内的文件相同,但 .jar 不同。
所以我用一个普通的 .zip 文件进行了测试,发现了这个:(
... $ zip 1.zip a.txt
... $ zip 2.zip a.txt
... $ ls -l ?.zip
-rw-rw-r-- 1 webinator webinator 147 2010-07-21 13:09 1.zip
-rw-rw-r-- 1 webinator webinator 147 2010-07-21 13:09 2.zip
完全相同的 .zip 文件大小)
... $ sha1sum ?.zip
db99f6ad5733c25c0ef1695ac3ca3baf5d5245cf 1.zip
eaf9f0f92eb2ac3e6ac33b44ef45b170f7984a91 2.zip
(不同的 SHA-1 总和,让我们看看为什么)
$ hexdump 1.zip -C > 1.txt
$ hexdump 2.zip -C > 2.txt
$ diff 1.txt 2.txt
3c3
< 00000020 74 78 74 55 54 09 00 03 ab d4 46 4c*4e*d5 46 4c |txtUT.....FLN.FL|
---
> 00000020 74 78 74 55 54 09 00 03 ab d4 46 4c*5d*d5 46 4c |txtUT.....FL].FL|
解压两个文件zip 文件肯定会返回我们独特的文件。
问:这是为什么呢? (我自己来回答)
I never really looked into it but now I realized that I can't easily build two identical .jar files.
I mean, if I build twice, without changing anything, I get the exact same size but different checksums for the .jar.
So I quickly ran some test (basically unzipping, sort -n -k 5'ing and then diff'ing) to see that all the files inside the .jar were identical, yet the .jar were different.
So I did a test with a plain .zip file and found this:
... $ zip 1.zip a.txt
... $ zip 2.zip a.txt
... $ ls -l ?.zip
-rw-rw-r-- 1 webinator webinator 147 2010-07-21 13:09 1.zip
-rw-rw-r-- 1 webinator webinator 147 2010-07-21 13:09 2.zip
(exact same .zip file size)
... $ sha1sum ?.zip
db99f6ad5733c25c0ef1695ac3ca3baf5d5245cf 1.zip
eaf9f0f92eb2ac3e6ac33b44ef45b170f7984a91 2.zip
(different SHA-1 sums, let see why)
$ hexdump 1.zip -C > 1.txt
$ hexdump 2.zip -C > 2.txt
$ diff 1.txt 2.txt
3c3
< 00000020 74 78 74 55 54 09 00 03 ab d4 46 4c*4e*d5 46 4c |txtUT.....FLN.FL|
---
> 00000020 74 78 74 55 54 09 00 03 ab d4 46 4c*5d*d5 46 4c |txtUT.....FL].FL|
Unzipping both zip files surely gives back our unique file.
Question: why is that? (I'll answer myself)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
(自言自语)这是因为.zip文件格式将创建和修改时间保存在其标头中。
如果您确实想创建两个相同的 .zip (或 .jar),则必须让第二个相信它是与第一个。
(Answering to myself) It is because the .zip file format saves the creation and modification time in its headers.
If you really do want to create two identical .zip (or .jar), you have to make the second one believe it was created/modified exactly at the same time as the first one.