Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java/zip:为什么.jar文件是非确定性创建的?_Java_Zip - Fatal编程技术网

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

Java/zip:为什么.jar文件是非确定性创建的?,java,zip,Java,Zip,我从未真正研究过它,但现在我意识到我不能轻松地构建两个完全相同的.jar文件 我的意思是,如果我构建两次,而不做任何更改,我会得到与.jar完全相同的大小,但不同的校验和 因此,我很快运行了一些测试(基本上是解压缩、排序-n-k5'ing,然后进行区分),以查看.jar中的所有文件都是相同的,而.jar是不同的 所以我用一个普通的.zip文件做了一个测试,结果发现: ... $ zip 1.zip a.txt ... $ zip 2.zip a.txt ... $ ls -l ?.zip -rw

我从未真正研究过它,但现在我意识到我不能轻松地构建两个完全相同的.jar文件

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

因此,我很快运行了一些测试(基本上是解压缩、排序-n-k5'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文件大小)

(不同的SHA-1金额,让我们看看原因)

$hextump 1.zip-C>1.txt
$hextump 2.zip-C>2.txt
$diff 1.txt 2.txt
3c3
<00000020747745554090003 ab D446 4c*4e*D546 4c | txtUT…..FLN.FL|
---
>000000 20 74 78 74 55 54 09 00 03 ab d4 46 4c*5d*d5 46 4c | txtUT…..佛罗里达州]|
解压缩这两个zip文件肯定会返回我们独特的文件

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

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


如果你真的想创建两个完全相同的.zip(或.jar),你必须让第二个相信它是在与第一个完全相同的时间创建/修改的。

既然你已经知道答案,为什么还要问一个问题?@Gumbo:我在键入问题时找到了答案(为什么这样可以让一个人回答自己的问题?:)并且发现这个问题可能会引起其他人的兴趣(十个观点中的两个向上投票似乎表明:)@Gumbo,偶尔“回答你自己的问题”被用来快速获得更多的声誉。@Thorbjørn Ravn Andersen:当然,如果您能够准确地预测您的所有类将在哪一秒编译并压缩在一起;)我想你把确定性和相同的。。。他们不一样。确定性意味着每次都以相同的方式构造,不需要相同的字节。您可以很容易地对文件进行二进制区分,并看到所有的更改都是时间戳(这是我们的一个主要客户必须做的事情,以便将新的依赖项检查到他们的dep repo中…这对他们来说是一件痛苦的事,但他们这样做是因为他们确实需要保证这些具有不同哈希的文件是相同的)predicion不是这里的问题。如果您可以创建一组保证生成输出数据的输入数据(包括系统时钟的值),那么它是确定的。您如何覆盖时间戳?
... $ sha1sum ?.zip
db99f6ad5733c25c0ef1695ac3ca3baf5d5245cf  1.zip
eaf9f0f92eb2ac3e6ac33b44ef45b170f7984a91  2.zip
$ 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|