Necesito almacenar de forma remota algunos fragmentos de datos y compararlos también para ver si hay duplicaciones. Voy a compilar un programa en C específico y me gustaría comprimir estos fragmentos con GZIP.
Mi duda es: si comprimo el mismo trozo de datos con el mismo programa C usando una biblioteca gzip en diferentes computadoras, ¿dará exactamente el mismo resultado o podría dar resultados comprimidos diferentes?
Las PC/servidores de destino podrían tener diferentes sistemas operativos Linux como Ubuntu/CentOs/Debian, etc.
¿Puedo forzar el mismo resultado vinculando estáticamente una biblioteca gzip específica?
si comprimo la misma porción de datos con el mismo programa C usando una biblioteca gzip en diferentes computadoras, ¿dará exactamente el mismo resultado o podría dar resultados comprimidos diferentes?
Si bien puede ser cierto en la mayoría de los casos, no creo que pueda hacer esta suposición con seguridad. La salida comprimida puede diferir según el nivel de compresión predeterminado y la codificación utilizada por la biblioteca. Por ejemplo, la herramienta GNU gzip usa LZ77 y OpenBSD gzip usa compress ( según Wikipedia ). No sé si esta diferencia proviene de diferentes bibliotecas o diferentes configuraciones de la misma biblioteca, pero no obstante, realmente evitaría asumir que una porción genérica de datos comprimidos con gzip es exactamente igual cuando se comprime usando diferentes implementaciones.
¿Puedo forzar el mismo resultado vinculando estáticamente una biblioteca gzip específica?
Sí, esto podría ser una solución. Usar la misma versión de la misma biblioteca con la misma configuración en diferentes sistemas le daría la misma salida comprimida.
También podría evitar este problema de otras maneras:
No, a menos que esté 100 % seguro de que está utilizando exactamente la misma versión del mismo código fuente con la misma configuración y de que ha desactivado la marca de tiempo modificada en el encabezado gzip.
No está claro qué está haciendo con estos fragmentos comprimidos, pero si la idea es tener menos para transmitir y comparar, entonces puede hacerlo mucho mejor con un hash. Use un SHA-256 en sus fragmentos sin comprimir, y luego podrá transmitirlos y compararlos en poco tiempo. La probabilidad de una coincidencia accidental es tan infinitesimalmente pequeña que tendrías que esperar a que todas las estrellas se apaguen para ver uno de esos sucesos.
¿Puedo forzar el mismo resultado vinculando estáticamente una biblioteca gzip específica?
Eso no es suficiente, también necesita el mismo nivel de compresión como mínimo, así como cualquier otra opción que pueda tener su biblioteca (por lo general, es solo el nivel).
Si usa la misma versión de la biblioteca y el mismo nivel de compresión, es probable que la salida sea idéntica (o estable, como usted la llama). Sin embargo, esa no es una garantía muy sólida, recomendaría usar una función hash en su lugar, para eso están destinados.