Come ottenere file compressi identici al 100%, per file di origine che differiscono solo per la data di creazione?


8

Voglio essere in grado di comprimere un file senza perdita di dati e se il file originale è identico al file di un altro utente, voglio che entrambi i nostri file compressi corrispondano, anche se le date del file originale sono diverse .

Voglio usare un massimo di 1 GB di RAM durante la compressione. Mi sto orientando verso un algoritmo asimmetrico perché i file che ho sono abbastanza grandi e impiegano almeno un'ora per comprimersi con LZMA1 "ultra" in 7-zip su una macchina P4 con 1 GB di RAM e nient'altro in esecuzione. Penso che 7-zip e FreeARC possano essere usati per i miei scopi. Ho provato a trovare i comandi che dovrei usare, ma non ho molta fortuna.

modifica : devono essere prodotti file identici al 100%, anche se le date di creazione sono diverse. Ciò dovrebbe essere possibile tramite --nodates in Freearc e con ???? a 7 zip. Sto cercando un comando equivalente per 7-zip e un modo per standardizzare la compressione su più computer.


1
Quanto sei sicuro che LZMA sia deterministico?
Ignacio Vazquez-Abrams,

2
Espandi la parte non avendo molta fortuna .
fideli,

2
Dov'è la domanda? Qualsiasi programma di compressione dovrebbe essere senza perdita a meno che non sia specificamente progettato per essere senza perdite.
In pausa fino a nuovo avviso.

Risposte:


11

Crea un paio di file identici:

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

decomprimili ...

$ gzip file1.test
$ gzip file2.test

osservare il campo data / ora come l'unica differenza:

$ 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                         

Per ulteriori informazioni sul timestamp, consultare RFC

Ora, puoi prendere un MD5 che inizia dopo il byte 8, azzerare questi quattro byte nei tuoi file e perdere i loro timestamp, oppure estrarre il CRC16 da quei gzips (vedi anche l'RFC per informazioni su come estrarlo)

Oppure puoi salvare senza il timestamp:

$ 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
E, se non gzipsono disponibili altre porte per Windows, Cygwin lo fornisce.
Arjan,

3

Non è una risposta diretta alla tua domanda, ma potrebbe essere comunque di aiuto.

Molto tempo fa (un millennio diverso) ho avuto lo stesso problema. Volevamo sapere se i file compressi fossero gli stessi senza decomprimerli e confrontarli.

La nostra soluzione era quella di ottenere un md5sum del file prima di comprimerlo, quindi abbiamo compresso il file e rinominato in md5sum.zip (.zip o .tar.gz o .rar o .whatever) . In questo modo sapevamo che se due file avevano lo stesso nome (senza suffisso) erano identici.


2
Nizza, anche se naturalmente sapevamo dovrebbe leggere abbiamo pensato ;-)
Arjan

Bello anche perché è totalmente indipendente dal tasso di compressione: i file compressi creati da programmi diversi o che utilizzano impostazioni diverse possono comunque essere riconosciuti come uguali.
Arjan,

1
Questo articolo praticamente cerca di risolvere lo stesso problema ... medium.com/@mpreziuso/…
XCore

2

pristine-tar ha una versione compromessa di gzip che produce sempre gli stessi risultati (e un'altra per bzip2). Scegli una variante dell'algoritmo e un timestamp e sei a posto.


1

Hack nelle fonti di 7-zip. Dove legge la data del file, basta inserire il codice per cambiare la data in 01.01.1997 o qualsiasi altra cosa - risolto per tutti i file. Compilare con un nome diverso e usarlo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.