|
Cette fonction se propose d'éliminer le problème avec les fonctions de hash basées sur l'addition en remplaçant les bytes par des valeurs 32 bits aléatoires, préalablement générées grâce à un algorithme quelconque, dans ce cas-ci par Mathematica. L'algorithme de diffusion est aussi un peu plus compliqué (alors qu'il est inexistant pour les fonctions de hash additive et multiplicative.) Il s'agit d'un générateur de code Gray. inline unsigned HashBricolage(const unsigned char *buffer, int size) { static const unsigned EXPAND[256]= #include "HashBricolageTable" ; unsigned h = 0; for (int i=0; i<size; i++) h = (h ^ (h >> 1) ) +EXPAND[ buffer[i] ]; // c'est ce qui aide le plus! return h; } Cette fonction est déjà beaucoup plus forte que les précédentes! Ce qui aide le plus, à n'en pas douter, c'est la promotion des octets en valeurs aléatoires de 32 bits et, par le fait même, la suppression de l'élément neutre de l'addition. Nous verrons qu'elle se classe très bien selon les tests. |