Comment obtenir des fichiers compressés 100% identiques, pour des fichiers sources qui ne diffèrent que par la date de création?

8

Je veux pouvoir compresser un fichier sans perte, et si le fichier d'origine est identique au fichier d'un autre utilisateur, je veux que nos deux fichiers compressés correspondent, même si les dates du fichier d'origine sont différentes .

Je souhaite utiliser un maximum de 1 Go de RAM lors de la compression. Je penche vers un algorithme asymétrique car les fichiers que j'ai sont assez volumineux, et ils prennent au moins une heure à compresser avec LZMA1 "ultra" en 7-zip sur une machine P4 avec 1 Go de RAM et rien d'autre en cours d'exécution. Je pense que 7-zip et FreeARC peuvent être utilisés à mes fins. J'ai essayé de trouver les commandes que je devrais utiliser, mais je n'ai pas beaucoup de chance.

edit : des fichiers 100% identiques doivent être produits, même si les dates de création sont différentes. Cela devrait être possible via --nodates dans Freearc, et avec ???? en 7 zip. Je recherche une commande équivalente pour 7-zip et un moyen de normaliser la compression sur plusieurs ordinateurs.

Andy
la source
1
Êtes-vous certain que le LZMA est déterministe?
Ignacio Vazquez-Abrams
2
Développez la partie n'ayant pas beaucoup de chance .
fideli
2
Où est la question? Tout programme de compression doit être sans perte, sauf s'il est spécifiquement conçu pour être avec perte.
pause jusqu'à nouvel ordre.

Réponses:

11

Créez quelques fichiers identiques:

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

les gzip ...

$ gzip file1.test
$ gzip file2.test

observer le champ d'horodatage comme la seule différence:

$ 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                         

Pour plus d'informations sur l'horodatage, consultez le RFC

Maintenant, vous pouvez soit prendre un MD5 qui commence après l'octet 8, mettre à zéro ces quatre octets dans vos fichiers et perdre leurs horodatages, ou extraire le CRC16 de ces gzips (voir également le RFC pour savoir comment extraire cela)

Ou, vous pouvez enregistrer sans horodatage:

$ 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
la source
1
Et, si aucun autre port de gzipn'est disponible pour Windows, Cygwin le fournit.
Arjan
3

Pas une réponse directe à votre question, mais cela pourrait être utile de toute façon.

Il y a longtemps (un autre millénaire), j'ai eu le même problème. Nous voulions savoir si les fichiers compressés étaient les mêmes sans les décompresser et les comparer.

Notre solution était d'obtenir une somme md5 du fichier avant de le compresser, puis nous avons compressé le fichier et l'avons renommé md5sum.zip (.zip ou .tar.gz ou .rar ou .wimporte) . De cette façon, nous savions que si deux fichiers avaient le même nom (sans suffixe), ils étaient identiques.

Nifle
la source
2
Bien, bien sûr, nous savions que nous devions lire, nous supposions ;-)
Arjan
Aussi agréable car il est totalement indépendant du taux de compression: les fichiers compressés créés par différents programmes ou utilisant différents paramètres peuvent toujours être reconnus comme étant les mêmes.
Arjan
1
Cet article essaie à peu près de résoudre le même problème ... medium.com/@mpreziuso/…
XCore
2

pristine-tar a une version piratée de gzip qui produit toujours les mêmes résultats (et une autre pour bzip2). Choisissez une variante d'algorithme et un horodatage et vous êtes prêt à partir.

Tobu
la source
1

Piratez les sources de 7-zip. Où il lit la date du fichier, insérez simplement le code pour changer la date au 01.01.1997, ou quoi que ce soit d'autre - fixé pour tous les fichiers. Compilez avec un nom différent et utilisez-le.

kagali-san
la source