Как получить 100% идентичные сжатые файлы для исходных файлов, которые отличаются только датой создания?


8

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

Я хочу использовать максимум 1 ГБ оперативной памяти при сжатии. Я склоняюсь к асимметричному алгоритму, потому что файлы, которые у меня есть, довольно большие, и их сжатие с помощью LZMA1 "ultra" в 7-zip занимает не менее часа на машине P4 с 1 ГБ ОЗУ и больше ничего не работает. Я думаю, что 7-zip и FreeARC могут быть использованы для моих целей. Я пытался найти команды, которые я должен использовать, но мне не повезло.

редактировать : должны быть созданы 100% идентичные файлы, даже если даты создания разные. Это должно быть возможно через --nodates во Freearc и с ???? в 7-почтовый индекс. Я ищу эквивалентную команду для 7-zip и способ стандартизации сжатия на нескольких компьютерах.


1
Насколько вы уверены, что LZMA является детерминированным?
Игнасио Васкес-Абрамс

2
Разобраться в том, что не так много удачи .
Фидели

2
Где вопрос? Любая программа сжатия должна быть без потерь, если она специально не сделана с потерями.
Приостановлено до дальнейшего уведомления.

Ответы:


11

Создайте пару идентичных файлов:

$ echo hello > file1.test
$ echo hello > file2.test

GZIP их ...

$ gzip file1.test
$ gzip file2.test

обратите внимание на поле отметки времени как единственную разницу:

$ hexdump file1.test.gz

0000000 8b1f 0808 TIME STMP 0300 6966 656c 2e31
0000010 6574 7473 cb00 cd48 c9c9 02e7 2000 3a30
0000020 0636 0000 0000                         

Для получения дополнительной информации о отметке времени см. RFC.

Теперь вы можете взять MD5, который начинается после 8 байта, обнулить эти четыре байта в файлах и потерять их временные метки, или извлечь CRC16 из этих gzips (также см. RFC для получения информации о том, как извлечь это).

Или вы можете сохранить без отметки времени:

$ echo test > file1.test
$ echo test > file2.test
$ gzip -n file1.test
$ gzip -n file2.test
$ md5sum file1.test.gz
cfe4ddf1c4c3891b4ff4a1269b42db82  file1.test.gz
$ md5sum file2.test.gz
cfe4ddf1c4c3891b4ff4a1269b42db82  file2.test.gz

1
И, если gzipдля Windows нет других портов , Cygwin предоставляет их.
Арджан

3

Не прямой ответ на ваш вопрос, но в любом случае это может помочь.

Давным-давно (другое тысячелетие) у меня была такая же проблема. Мы хотели узнать, были ли сжатые файлы одинаковыми, не распаковывая их и не сравнивая их.

Нашим решением было получить md5- сумму файла перед его сжатием, затем мы сжали файл и переименовали его в md5sum.zip (.zip или .tar.gz или .rar или .whothing) . Таким образом, мы знали, что если два файла имеют одинаковое имя (без суффикса), они идентичны.


2
Хорошо, хотя, конечно, мы знали, что должны читать, мы предполагали ;-)
Арджан

Также приятно, что он полностью не зависит от степени сжатия: сжатые файлы, созданные разными программами или использующие другие настройки, могут по-прежнему распознаваться как одинаковые.
Арьян

1
Эта статья в значительной степени пытается решить ту же проблему ... medium.com/@mpreziuso/…
XCore

2

У pristine-tar есть взломанная версия gzip, которая всегда дает одинаковые результаты (и другую для bzip2). Выберите вариант алгоритма и отметку времени, и все готово.


1

Взломать источники 7-zip. Там, где он читает дату файла, просто вставьте код для изменения даты на 01.01.1997 или что-то другое - исправлено для всех файлов. Скомпилируйте с другим именем и используйте его.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.