38Fermer40
FpgForceLe 07/01/2006 à 11:38
Oula non pas de MD5 happy

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
	} ;