Java / zip: почему файлы .jar создаются недетерминированным образом? - PullRequest
12 голосов
/ 21 июля 2010

Я никогда не задумывался об этом, но теперь я понял, что не могу легко создать два одинаковых файла .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-файлов, безусловно, возвращает наш уникальный файл.

Вопрос: почему это так? (Я отвечу сам)

1 Ответ

6 голосов
/ 21 июля 2010

(отвечая самому себе) Это потому, что формат файла .zip экономит время создания и изменения в своих заголовках.

Если вы действительно хотитесоздайте два идентичных .zip (или .jar ), вы должны заставить второго поверить, что он был создан / изменен точно в то же время, что и первый.

...