¿Por qué comprimir el mismo contenido dos veces da dos archivos con SHA1 diferente?
Me he encontrado con un extraño problema con los archivos git y zip. Mi script de compilación toma un montón de páginas html de documentación y las comprime en docs.zip. Luego verifico este archivo en git.
El problema que tengo es que cada vez que vuelvo a ejecutar el script de compilación y obtengo un nuevo archivo zip, el nuevo archivo zip tiene un SHA1 diferente al de la ejecución anterior. Mi script de compilación llama a la tarea ant zip. Sin embargo, llamar manualmente al zip de macOSX desde el shell de Mac OS X me da un sha1 diferente si comprimo el mismo directorio dos veces.
Ejecución 1:
zip foo.zip *
openssl sha1 foo.zip
rm foo.zip
Ejecutar 2:
zip foo.zip *
openssl sha1 foo.zip
Run 1 y run2 dan SHA1 diferente a pesar de que el contenido no cambió entre ejecuciones. En ambos casos, zip imprime exactamente los mismos archivos que se están comprimiendo, no indica que ningún archivo específico del sistema operativo como .DS_Store esté incluido en el archivo zip.
¿Es el algoritmo zip determinista? Si se ejecuta en el mismo contenido, ¿producirá exactamente los mismos bits? ¿si no, porque no
¿Cuáles son mis opciones para comprimir los archivos de manera determinista? Hay miles de ellos en el archivo comprimido, no espero que esos archivos cambien mucho. Sé que git comprimirá cualquier archivo que registres, pero la motivación para comprimirlos es simplemente mantener la masa fuera del camino.