Fonction modulo


Cette fonction calcule

H(K) = ( K mod d )  mod m

pour un entier d bien choisi, et où la clef K est considérée comme un grand entier. Ici aussi m est la grandeur de la table.





 inline unsigned HashMod(const unsigned char *buffer, 
                         int size)
  {
   static const unsigned REMAINDERS[256]=
    #include "HashModTable"
    ;

   unsigned mod=0;

   for (int i=0; i<size; i++)
    {
     unsigned char t = (mod >> 24);
     mod = (mod << 8) + buffer[i];
     mod ^= REMAINDERS[t];
    }

   return mod;
  }




Cette fonction est en fait une implémentation efficace du calcul du CRC (cyclical redundancy check) grâce à une table où on conserve les résultats partiels de la division par le diviseur, le d dans la formule ci-haut. Ce d doit être choisi judicieusement, et plusieurs se sont penchés sur le problème. Ici, j'ai choisi le diviseurs proposé par le (feu) CCITT, 0x84c11db7u, ou 222724856710.




( steven.pigeon@videotron.ca )