Wie erhalte ich 100% identische komprimierte Dateien für Quelldateien, die sich nur im Erstellungsdatum unterscheiden?

8

Ich möchte in der Lage sein, eine Datei verlustfrei zu komprimieren. Wenn die Originaldatei mit der Datei eines anderen Benutzers identisch ist, möchte ich, dass beide komprimierten Dateien übereinstimmen, auch wenn die Daten der Originaldatei unterschiedlich sind .

Ich möchte beim Komprimieren maximal 1 GB RAM verwenden. Ich neige zu einem asymmetrischen Algorithmus, weil die Dateien, die ich habe, ziemlich groß sind und die Komprimierung mit LZMA1 "ultra" in 7-zip auf einem P4-Computer mit 1 GB RAM und sonst nichts läuft mindestens eine Stunde dauert. Ich denke, 7-zip und FreeARC können für meine Zwecke verwendet werden. Ich habe versucht, die Befehle zu finden, die ich verwenden sollte, aber ich habe nicht viel Glück.

Bearbeiten : 100% identische Dateien sollten erstellt werden, auch wenn die Erstellungsdaten unterschiedlich sind. Dies sollte durch --nodates in Freearc und mit ???? in 7-zip. Ich suche nach einem entsprechenden Befehl für 7-zip und nach einer Möglichkeit, die Komprimierung auf mehreren Computern zu standardisieren.

Andy
quelle
1
Wie sicher sind Sie, dass LZMA deterministisch ist?
Ignacio Vazquez-Abrams
2
Erweitern Sie den Teil, der nicht viel Glück hat .
Fideli
2
Wo ist die Frage? Jedes Komprimierungsprogramm sollte verlustfrei sein, es sei denn, es wurde speziell als verlustbehaftet eingestuft.
Bis auf weiteres angehalten.

Antworten:

11

Erstellen Sie einige identische Dateien:

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

gzip sie ...

$ gzip file1.test
$ gzip file2.test

Zeitstempelfeld als einzigen Unterschied beobachten:

$ 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                         

Weitere Informationen zum Zeitstempel finden Sie im RFC

Jetzt können Sie entweder ein MD5 nehmen, das nach Byte 8 beginnt, diese vier Bytes in Ihren Dateien auf Null setzen und ihre Zeitstempel verlieren, oder den CRC16 aus diesen GZips extrahieren (Informationen zum Extrahieren finden Sie auch im RFC).

Oder Sie können ohne Zeitstempel speichern:

$ 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
Gareth Davidson
quelle
1
Wenn gzipfür Windows keine anderen Ports verfügbar sind, stellt Cygwin diese bereit.
Arjan
3

Keine direkte Antwort auf Ihre Frage, aber es könnte trotzdem hilfreich sein.

Vor langer Zeit (einem anderen Jahrtausend) hatte ich das gleiche Problem. Wir wollten wissen, ob komprimierte Dateien gleich sind, ohne sie zu dekomprimieren und zu vergleichen.

Unsere Lösung bestand darin, vor dem Komprimieren eine MD5-Summe der Datei abzurufen. Anschließend haben wir die Datei komprimiert und in md5sum.zip (.zip oder .tar.gz oder .rar oder .whatever) umbenannt . Auf diese Weise wussten wir, dass zwei Dateien mit demselben Namen (ohne Suffix) identisch waren.

Nifle
quelle
2
Schön, obwohl wir natürlich wussten, dass wir lesen sollten, nahmen wir an ;-)
Arjan
Auch schön, da es völlig unabhängig von der Komprimierungsrate ist: Komprimierte Dateien, die von verschiedenen Programmen erstellt wurden oder unterschiedliche Einstellungen verwenden, werden möglicherweise immer noch als gleich erkannt.
Arjan
1
Dieser Artikel versucht so ziemlich das gleiche Problem zu lösen ... medium.com/@mpreziuso/…
XCore
2

pristine-tar hat eine gehackte Version von gzip, die immer die gleichen Ergebnisse liefert (und eine andere für bzip2). Wählen Sie eine Algorithmusvariante und einen Zeitstempel und los geht's.

Tobu
quelle
1

Hacken Sie in die Quellen von 7-zip. Wenn das Dateidatum gelesen wird, geben Sie einfach den Code ein, um das Datum auf den 01.01.1997 oder etwas anderes zu ändern - für alle Dateien behoben. Kompilieren Sie mit einem anderen Namen und verwenden Sie ihn.

Kagali-San
quelle