2010-07-21 6 views
11

Je ne l'ai jamais vraiment regardé mais maintenant j'ai réalisé que je ne peux pas facilement créer deux fichiers .jar identiques. Je veux dire, si je construis deux fois, sans rien changer, j'obtiens exactement la même taille mais des sommes de contrôle différentes pour le .jar.Java/zip: Pourquoi les fichiers .jar sont-ils créés de manière non déterministe?

Alors je me suis vite couru quelques tests (essentiellement décompressé, sort -n -k 5 'ing puis diff' ing) pour voir que tous les fichiers à l'intérieur .jar étaient identiques, mais les .jar étaient différents.

J'ai donc fait un test avec un fichier .zip simple et trouvé ceci:

... $ zip 1.zip a.txt 
... $ zip 2.zip a.txt 
... $ ls -l ?.zip 
-rw-rw-r-- 1 webinator webinator 147 2010-07-21 13:09 1.zip 
-rw-rw-r-- 1 webinator webinator 147 2010-07-21 13:09 2.zip 

(exactement la même taille de fichier .zip)

... $ sha1sum ?.zip 
db99f6ad5733c25c0ef1695ac3ca3baf5d5245cf 1.zip 
eaf9f0f92eb2ac3e6ac33b44ef45b170f7984a91 2.zip 

(différent SHA-1 sommes, voyons pourquoi)

$ hexdump 1.zip -C > 1.txt 

$ hexdump 2.zip -C > 2.txt 

$ diff 1.txt 2.txt 
3c3 
< 00000020 74 78 74 55 54 09 00 03 ab d4 46 4c*4e*d5 46 4c |txtUT.....FLN.FL| 
--- 
> 00000020 74 78 74 55 54 09 00 03 ab d4 46 4c*5d*d5 46 4c |txtUT.....FL].FL| 

Dézipper les deux fichiers zip rend sûrement notre fichier unique.

Question: pourquoi est-ce? (Je vais répondre moi-même)

+1

Pourquoi posez-vous une question lorsque vous connaissez déjà la réponse? – Gumbo

+1

@Gumbo: J'ai trouvé la réponse en tapant la question (pourquoi SO permet-il de répondre à sa propre question? :) et compris que la question peut intéresser d'autres personnes (que les deux upvotes sur dix semblent indiquer :) – SyntaxT3rr0r

+0

Pourquoi la downvote? – SyntaxT3rr0r

Répondre

6

(Répondre à moi-même) c'est que le format de fichier .zip enregistre le temps de création et de modification dans ses en-têtes.

Si vous voulez vraiment créer deux identiques .zip (ou .jar), vous devez faire le deuxième croire qu'il a été créé/modifiée exactement en même temps que le premier.

+3

Puis il _IS_ créé de manière déterministe ... –

+1

@ Thorbjørn Ravn Andersen: bien sûr, si vous pouvez prédire avec précision à quelle seconde toute votre classe aura été compilée et sera compressée ensemble;) – SyntaxT3rr0r

+2

Je pense que vous confondez déterministe avec identique. .. ils ne sont pas les mêmes. Des moyens déterministes construits de la même manière à chaque fois, pas nécessairement des octets identiques. Vous pouvez facilement faire un diff binaire sur les fichiers et voir que tout a changé est timestamps (c'est quelque chose que l'un de nos principaux clients doit faire pour obtenir de nouvelles dépendances vérifiées dans leur dep-repo ... et c'est une douleur pour eux de faire , mais ils le font parce qu'ils ont besoin de garantir que ces fichiers avec des hashes différents sont identiques). – corsiKa

Questions connexes