Java / zip:为什么.jar文件是非确定性创建的?

时间:2010-07-21 10:21:00

标签: java zip

我从未真正研究过它,但现在我意识到我无法轻松构建两个相同的.jar文件。

我的意思是,如果我构建两次,没有更改任何内容,我会得到完全相同的大小但 .jar 的校验和。

所以我快速运行了一些测试(基本上解压缩 sort -n -k 5 'ing然后 diff ')看看所有文件里面 .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文件肯定会返回我们唯一的文件。

问题:为什么? (我会自己回答)

1 个答案:

答案 0 :(得分:6)

(回答自己)这是因为 .zip 文件格式在其标题中保存了创建和修改时间。

如果你确实想要创建两个相同的 .zip (或 .jar ),你必须让第二个认为它是在与第一个同时出现。