2011-03-15 2 views
2

J'utilise libLZF pour la compression dans mon application. Dans la documentation, il y a un commentaire qui me concerne:LZF peut compresser avec différents algorithmes

lzf_compress might use different algorithms on different systems and 
even different runs, thus might result in different compressed strings 
depending on the phase of the moon or similar factors. 

Je prévois de comparer les données compressées à savoir si l'entrée était identique. Évidemment, si différents algorithmes étaient utilisés, les données compressées seraient différentes. Y at-il une solution à ce problème? Peut-être un moyen de forcer un certain algorithme à chaque fois? Ou ce commentaire n'est-il jamais vrai dans la pratique? Après tout, phase of the moon, or similar factors est un peu étrange.

Répondre

6

La raison de la "dépendance de phase de lune" est qu'ils omettent l'initialisation de certaines structures de données pour évincer un peu de performance (seulement si cela n'affecte pas l'exactitude de la décompression, bien sûr). Pas une astuce rare, car les bibliothèques de compression vont. Donc, si vous mettez votre code de compression dans un processus distinct, et que votre système d'exploitation zérote la mémoire avant de le transmettre à un processus (tous les «grands» systèmes d'exploitation le font, mais certains ne le font pas), vous obtiendrez toujours la même résultat de compression.

Aussi, prenez note de ce qui suit, de lzfP.h:

/* 
* You may choose to pre-set the hash table (might be faster on some 
* modern cpus and large (>>64k) blocks, and also makes compression 
* deterministic/repeatable when the configuration otherwise is the same). 
*/ 
#ifndef INIT_HTAB 
# define INIT_HTAB 0 
#endif 

Je pense que vous avez seulement besoin de #define INIT_HTAB 1 lors de la compilation libLZF pour le rendre déterministe, mais ne parierais pas là-dessus trop sans une analyse plus approfondie.

+0

Cela semble très prometteur, merci. – JaredC

+0

Après quelques recherches, il semble que cela fasse exactement ce dont j'avais besoin. Je ne sais pas comment j'ai manqué cela dans la documentation, mais merci beaucoup! – JaredC

+0

@JaredC - merci de partager la conclusion de votre analyse. – atzz

6

Décompressez à la volée, puis comparez.

Le site Web de libLZF indique que «la décompression [...] est fondamentalement à (la vitesse de memcpy non optimisée»).

+0

C'est une bonne idée, mais je préférerais ne pas avoir à décompresser à la volée. Pour diverses raisons, cela serait très compliqué car il est intégré dans un système distribué. – JaredC

+0

Sauf si vous contrôlez également la partie de compression, je pense que vous ne devriez pas supposer que la même entrée doit produire la même sortie compressée; et devrait compresser les données non compressées. En fonction de votre objectif, il peut être plus judicieux d'exiger le calcul de la somme de contrôle du contenu avant (ou pendant) la compression, de le stocker séparément et de l'utiliser pour les comparaisons. – StaxMan

Questions connexes