8

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

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

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

4 ответа4

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
3

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

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

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

2

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

1

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .