int fast_and_perfect_hash(const char *str, int length) // works only with HASH_TABLE_SIZE = 256 or 512 or 1024 { // very good Daniel Julius Bernstein's algorithm // speed optimized by Pollux // unrolled by Thibaut for more speed // generates very uniform hash tables even with non prime modulos register unsigned int hash = 5381; // DJB Hash register unsigned int hash5 = 0; register const char *s; register int i; s = str-sizeof(char); i= (length / 4)+sizeof(char); while (--i > 0) { hash5+= hash; hash+= *++s; hash5+= hash; hash+= *++s; hash5+= hash; hash+= *++s; hash5+= hash; hash+= *++s; } i= (length % 4)+sizeof(char); while (--i > 0) { hash5+= hash; hash+= *++s; } return (hash + (hash5<<5)) % HASH_TABLE_SIZE; }