¿Cómo obtener archivos comprimidos 100% idénticos, para archivos fuente que solo difieren en la fecha de creación?

8

Quiero poder comprimir un archivo sin pérdidas, y si el archivo original es idéntico al archivo de otro usuario, quiero que ambos archivos comprimidos coincidan, incluso si las fechas del archivo original son diferentes .

Quiero usar un máximo de 1 GB de RAM mientras comprimo. Me estoy inclinando hacia un algoritmo asimétrico porque los archivos que tengo son bastante grandes y tardan al menos una hora en comprimirse con LZMA1 "ultra" en 7-zip en una máquina P4 con 1 GB de RAM y nada más en ejecución. Creo que 7-zip y FreeARC pueden usarse para mis propósitos. Intenté encontrar los comandos que debería usar, pero no tengo mucha suerte.

editar : se deben producir archivos 100% idénticos, incluso si las fechas de creación son diferentes. Esto debería ser posible a través de --nodates en Freearc, y con ???? en 7-zip. Estoy buscando un comando equivalente para 7-zip y una forma de estandarizar la compresión en varias computadoras.

Andy
fuente
1
¿Qué tan seguro estás de que LZMA es determinista?
Ignacio Vazquez-Abrams
2
Expande la parte de no tener mucha suerte .
fideli el
2
¿Dónde está la pregunta? Cualquier programa de compresión debe ser sin pérdidas a menos que esté específicamente diseñado para ser con pérdidas.
Pausado hasta nuevo aviso.

Respuestas:

11

Crea un par de archivos idénticos:

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

gzip ellos ...

$ gzip file1.test
$ gzip file2.test

observe el campo de marca de tiempo como la única diferencia:

$ 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                         

Para obtener más información sobre la marca de tiempo, consulte el RFC

Ahora, puede tomar un MD5 que comienza después del byte 8, poner a cero estos cuatro bytes en sus archivos y perder sus marcas de tiempo, o extraer el CRC16 de esos gzips (también vea el RFC para obtener información sobre cómo extraer esto)

O bien, podría guardar sin la marca de tiempo:

$ 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
fuente
1
Y, si no hay otros puertos gzipdisponibles para Windows, Cygwin lo proporciona.
Arjan
3

No es una respuesta directa a su pregunta, pero podría ser de ayuda de todos modos.

Hace mucho tiempo (un milenio diferente) tuve el mismo problema. Queríamos saber si los archivos comprimidos eran los mismos sin descomprimirlos y compararlos.

Nuestra solución fue obtener un md5sum del archivo antes de comprimirlo, luego comprimimos el archivo y le cambiamos el nombre a md5sum.zip (.zip o .tar.gz o .rar o .whatever) . De esa manera, sabíamos que si dos archivos tenían el mismo nombre (sin sufijo), serían idénticos.

Nifle
fuente
2
Agradable, aunque por supuesto sabíamos que deberíamos leer asumimos ;-)
Arjan
También es bueno, ya que es totalmente independiente de la tasa de compresión: los archivos comprimidos creados por diferentes programas o que usan diferentes configuraciones aún pueden ser reconocidos como iguales.
Arjan
1
Este artículo intenta resolver el mismo problema ... medium.com/@mpreziuso/…
XCore
2

pristine-tar tiene una versión pirateada de gzip que siempre produce los mismos resultados (y otra para bzip2). Elija una variante de algoritmo y una marca de tiempo y listo.

Tobu
fuente
1

Hackea las fuentes de 7-zip. Cuando lea la fecha del archivo, simplemente inserte el código para cambiar la fecha a 01.01.1997, o cualquier otra cosa, corregida para todos los archivos. Compila con un nombre diferente y úsalo.

kagali-san
fuente