Fonction Adler32


Cette fonction est censée être un remplacement computationnellement économique du CRC-32 pour la librairie de compression Zlib. Ici, je présente une version très simplifiée du code (mais équivalente.) On peut y apporter des optimisations de bouts de chandelles qu'il n'est pas nécessaire de considérer ici.





 inline unsigned HashAdler32(const unsigned char buffer[], 
                             int size )
  {
const unsigned BASE = 65521u; const unsigned NMAX = 5552u;
unsigned s1=0; unsigned s2=0; for (int i=0, j=0; i<size; i++, j++) { s1 += buffer[i]; s2 += s1;
if (j==NMAX) { s1 %= BASE; s2 %= BASE; j=0; }
} return (s2<<16) | s1; }


Cette fonction qui devrait être faible (elle est basée sur l'addition) est en fait assez forte car elle utilise des sommes imbriquées. La variable s2 est en fait une somme de somme, qui a un comportement quadratique. Le modulo avec 65521 n'agit que pour les clefs très longues (à l'origine, c'est une fonction de détection d'erreur qui peut être appliquée à une grande plage de mémoire.) On pourrait donc retirer tout ce qui a trait aux modulos dans la fonction sans en affecter la performance pour des clefs de longueur inférieure à 5552 octets. Les parties que l'on peut éliminer son marquées par un fond plus pâle.




( steven.pigeon@videotron.ca )