Почему двойное сжатие одного и того же содержимого дает два файла с разными SHA1?

Я столкнулся со странной проблемой с файлами git и zip. Мой скрипт сборки берет кучу html-страниц документации и сжимает их в docs.zip. Затем я проверяю этот файл в git.

Проблема, с которой я сталкиваюсь, заключается в том, что каждый раз, когда я повторно запускаю скрипт сборки и получаю новый zip-файл, новый zip-файл имеет SHA1, отличный от предыдущего запуска. Мой скрипт сборки вызывает задачу ant zip. Однако ручной вызов zip macOSX из оболочки Mac OS X дает мне другой sha1, если я дважды заархивирую один и тот же каталог.

Запуск 1:

zip foo.zip *
openssl sha1 foo.zip 
rm foo.zip 

Запуск 2:

zip foo.zip *
openssl sha1 foo.zip

Запуск 1 и запуск 2 дают разные SHA1, даже если содержимое не изменилось между запусками. В обоих случаях zip распечатывает точно такие же архивируемые файлы, это не указывает на то, что в zip-файл включены какие-либо специфичные для ОС файлы, такие как .DS_Store.

Является ли алгоритм zip детерминированным? Если запустить на одном и том же контенте, будет ли он создавать точно такие же биты? если нет, то почему?

Какие у меня есть варианты архивирования файлов детерминированным образом? В заархивированном файле их тысячи, я не ожидаю, что эти файлы сильно изменятся. Я знаю, что git заархивирует любые файлы, которые вы зарегистрируете, но мотивация заархивировать их состоит в том, чтобы просто не мешать их массе.

17
задан ams 15 March 2012 в 04:48
поделиться