#include #include #include #include "jhash.h" /* from https://www.burtleburtle.net/bob/c/lookup2.c -------------------------------------------------------------------- jhash() -- hash a variable-length key into a 32-bit value k : the key (the unaligned variable-length array of bytes) len : the length of the key, counting by bytes initval : the previous hash, or an arbitrary value Returns a 32-bit value. Every bit of the key affects every bit of the return value. Every 1-bit and 2-bit delta achieves avalanche. About 36+6len instructions. The best hash table sizes are powers of 2. There is no need to do mod a prime (mod is sooo slow!). If you need less than 32 bits, use a bitmask. For example, if you need only 10 bits, do h = (h & hashmask(10)); In which case, the hash table should have hashsize(10) elements. If you are hashing n strings (ub1 **)k, do it like this: for (i=0, h=0; i= 12) { a += (k[0] + ((ub4)k[1] << 8) + ((ub4)k[2] << 16) + ((ub4)k[3] << 24)); b += (k[4] + ((ub4)k[5] << 8) + ((ub4)k[6] << 16) + ((ub4)k[7] << 24)); c += (k[8] + ((ub4)k[9] << 8) + ((ub4)k[10] << 16) + ((ub4)k[11] << 24)); mix(a, b, c); k += 12; len -= 12; } /*------------------------------------- handle the last 11 bytes */ c += length; switch (len) /* all the case statements fall through */ { case 11: c += ((ub4)k[10] << 24); case 10: c += ((ub4)k[9] << 16); case 9: c += ((ub4)k[8] << 8); /* the first byte of c is reserved for the length */ case 8: b += ((ub4)k[7] << 24); case 7: b += ((ub4)k[6] << 16); case 6: b += ((ub4)k[5] << 8); case 5: b += k[4]; case 4: a += ((ub4)k[3] << 24); case 3: a += ((ub4)k[2] << 16); case 2: a += ((ub4)k[1] << 8); case 1: a += k[0]; /* case 0: nothing left to add */ } mix(a, b, c); /*-------------------------------------------- report the result */ return c; }