|
Cette fonction calcule 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. |