Як отримати 100% однакові стислі файли для вихідних файлів, які відрізняються лише датою створення?


8

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

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

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


1
Наскільки ви впевнені, що LZMA є детермінованою?
Ігнасіо Васкес-Абрамс

2
Розгорніть на не маючу велику частину удачі .
fideli

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

Це не пряма відповідь на ваше запитання, але це все одно може допомогти.

Давно (інше тисячоліття) у мене була така ж проблема. Ми хотіли дізнатися, чи стиснуті файли там, де те саме, не розпаковуючи їх і порівнюючи.

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


2
Приємно, хоча, звичайно, ми знали, що повинні прочитати, ми припустили ;-)
Ар'ян

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

1
Ця стаття в значній мірі
XCore

2

pristine-tar має злому версію gzip, яка завжди дає однакові результати (та іншу для bzip2). Виберіть варіант алгоритму та часову позначку, і ви готові йти.


1

Виламуйте джерела 7-zip. Там, де він читає дату файлу, просто вставте код, щоб змінити дату на 01.01.1997, або що-небудь інше - фіксований для всіх файлів. Компілюйте з іншою назвою та використовуйте її.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.