En me basant sur les fréquences moyennes d'apparition des lettres dans un texte anglais (
cf ici), j'ai inventé une méthode (un peu lente par rapport à un hachage par simple addition des codes ASCII) qui donnerait peut-être de bons résultats.
Constatation :
Dans le lien donné ci-dessus, on observe que l'on trouve presque autant de lettres paires que de lettres impaires dans un texte anglais.
La somme des fréquences des lettres ayant un code ASCII pair est de 43,42 %
La somme des fréquences des lettres ayant un code ASCII impair est de 56,57 %
Exploitation :
J'ai donc pensé qu'en basant mon algorithme sur ce fait, j'obtiendrais une répartition à peu près homogène des valeurs de hachage.
, dans un int
}
Voici mon idée :int hash_thib(const unsigned char *c) // on suppose que la longueur des chaines est toujours
{ // multiple de 8, uniquement dans le but de simplifier l'algo
unsigned char h, result;
int bit_index;
result= 0;
while (*c != 0) {
h= 0;
bit_index= 8; // on travaille par blocs de 8 caractères
while (bit_index-- > 0) {
h= (h << 1) + (*c & 1); // je pense avoir écrit cette ligne d'une manière claire...
// en fait, à la fin de la boucle, chaque bit de h représente
// la parité de la lettre correspondante dans le bloc
c++;
}
result+= h; // cette représentation de la parité des 8 caractères du bloc, on la
// considère comme une valeur. On l'additionne alors à la valeur du bloc précédent
}
return ((unsigned short)result); // on renvoit le résultat, compris entre 0 et 255
(J'ai simplifié l'implémentation, car on parle d'algorithme. Il y a moyen de le coder d'une manière relativement plus rapide.)
Qu'en pensez-vous ?