【问题标题】:Java/zip: Why are .jar files non-deterministically created?Java/zip:为什么非确定性地创建 .jar 文件?
【发布时间】:2019-12-14 23:50:58
【问题描述】:

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

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

所以我快速运行了一些测试(基本上是 unzippingsort -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 文件肯定会返回我们独特的文件。

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

【问题讨论】:

  • 既然已经知道答案,为什么还要问?
  • @Gumbo:我在输入问题时找到了答案(为什么 SO 允许一个人回答他自己的问题?:) 并发现这个问题可能会引起其他人的兴趣(这两个人赞成十个意见似乎表明:)
  • @Gumbo,偶尔会用“回答你自己的问题”来快速获得更多声望。

标签: java zip


【解决方案1】:

(自问自答)是因为.zip文件格式,把创建和修改的时间都保存在了头文件中。

如果你真的想创建两个相同的 .zip(或 .jar),你必须让第二个相信它是在和第一个一样。

【讨论】:

  • @Thorbjørn Ravn Andersen:当然,如果你能准确预测你的所有类将在哪一秒被编译并被压缩在一起;)
  • 我认为您将确定性与相同混淆了......它们不一样。确定性意味着每次都以相同的方式构造,不需要相同的字节。您可以轻松地对文件进行二进制差异,并看到所有已更改的只是时间戳(这是我们的一个主要客户必须做的事情才能将新的依赖项检查到他们的 dep-repo 中......这对他们来说很痛苦) ,但他们这样做是因为他们确实需要保证这些具有不同哈希值的文件是相同的)。
  • 预测不是这里的问题。如果您可以创建一组保证产生输出数据的输入数据(这包括系统时钟的值),那么它是确定性的。
  • 那么如何覆盖时间戳?
猜你喜欢
  • 2017-01-26
  • 1970-01-01
  • 2018-10-21
  • 2011-06-03
  • 2013-08-05
  • 2012-01-07
  • 2011-02-21
  • 2013-02-13
  • 1970-01-01
相关资源
最近更新 更多