Oula non pas de MD5
Alors moi j'ai utilisé la technique du flemmard en fait, j'ai d'abord tatonné pour essayer de construire la fonction de hachage à la main et finalement c'est super dur, surtout quand le nom des fonctions n'a pas été prévu à l'avance pour cet algo. J'ai donc utilisé un outil qui sert normalement pour les compilateurs / interpreteurs: gperf, qui génère des fonctions de hachage "parfaites".
Vous trouverez plus d'infos ici:
http://www.gnu.org/software/gperf/gperf.html
J'ai passé pas mal de temps à jouer sur les options du programme pour arriver à un tableau acceptable, j'ai modifié un peu le code résultant et vala:
la fonction:
unsigned int
hash (register const char *str, register unsigned int len)
{
static const unsigned char asso_values[] =
{
51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
51, 51, 51, 1, 51, 0, 51, 51, 51, 51,
18, 51, 51, 51, 51, 51, 51, 51, 25, 51,
51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
51, 51, 51, 51, 51, 51, 51, 13, 11, 0,
15, 9, 0, 8, 15, 1, 51, 14, 2, 8,
2, 14, 7, 51, 1, 0, 1, 51, 6, 7,
22, 5, 51, 51, 51, 51, 51, 51, 51, 51,
51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
51, 51, 51, 51, 51, 51
} ;
register int hval = len ;
switch (hval)
{
default:
hval += asso_values[(unsigned char)str[4]] ;
case 4:
case 3:
hval += asso_values[(unsigned char)str[2]] ;
case 2:
case 1:
hval += asso_values[(unsigned char)str[0]] ;
break ;
}
return hval ;
}
Le tableau de pointeurs:
void (*fctlist[])(unsigned short *, char *, char *, SCR_RECT, short *) =
{
dummy,
minus,
plus,
dummy, dummy, dummy,
slclr,
fclrscr,
slrcl,
sprite,
rclscr,
filltri,
fillrect,
savscr,
savpic,
version,
picsize,
foff,
fillpoly,
map,
msg,
mkpic,
slmsg,
setcont,
pretty,
gray,
ellipse,
initdelay,
delay,
pinfo,
getcont,
frect,
font,
pix,
line,
plane,
drawstr,
drawstrv,
wait,
keywait,
keylow,
busy,
breakoff,
width,
beep2,
dummy,
pixtest,
dummy, dummy, dummy,
beep
} ;