9 static const size_t INITIAL_TABLE_SIZE = 128;
10 static const double MAX_LOAD = 0.75;
14 * Paul Hsieh's SuperFastHash
15 * http://www.azillionmonkeys.com/qed/hash.html
20 #if (defined(__GNUC__) && defined(__i386__)) || defined(__WATCOMC__) \
21 || defined(_MSC_VER) || defined (__BORLANDC__) || defined (__TURBOC__)
22 #define get16bits(d) (*((const uint16_t *) (d)))
25 #if !defined (get16bits)
26 #define get16bits(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8)\
27 +(uint32_t)(((const uint8_t *)(d))[0]) )
30 static uint32_t hash(const char * data, size_t len) {
31 uint32_t hash = len, tmp;
34 if (len <= 0 || data == NULL) return 0;
40 for (;len > 0; len--) {
41 hash += get16bits (data);
42 tmp = (get16bits (data+2) << 11) ^ hash;
43 hash = (hash << 16) ^ tmp;
44 data += 2*sizeof (uint16_t);
48 /* Handle end cases */
50 case 3: hash += get16bits (data);
52 hash ^= data[sizeof (uint16_t)] << 18;
55 case 2: hash += get16bits (data);
59 case 1: hash += *data;
64 /* Force "avalanching" of final 127 bits */
77 static void rehash(hash_table* T, size_t new_n);
78 static void clear_hash_table(hash_table*);
82 hash_table* create_hash_table()
84 hash_table* T = malloc_or_die(sizeof(hash_table));
85 T->A = malloc_or_die(INITIAL_TABLE_SIZE * sizeof(hashed_value*));
86 memset(T->A, 0, INITIAL_TABLE_SIZE * sizeof(hashed_value*));
87 T->n = INITIAL_TABLE_SIZE;
89 T->max_m = T->n * MAX_LOAD;
95 void destroy_hash_table(hash_table* T)
106 void clear_hash_table(hash_table* T)
110 for (i = 0; i < T->n; i++) {
113 free(T->A[i]->value);
123 static void insert_without_copy(hash_table* T, hashed_value* V)
125 uint32_t h = hash(V->value, V->len) % T->n;
133 static void rehash(hash_table* T, size_t new_n)
138 U.max_m = U.n * MAX_LOAD;
139 U.A = malloc_or_die(U.n * sizeof(hashed_value*));
140 memset(U.A, 0, U.n * sizeof(hashed_value*));
144 for (i = 0; i < T->n; i++) {
148 insert_without_copy(&U, j);
161 void inc_hash_table(hash_table* T, const char* value, size_t len)
163 if (T->m >= T->max_m) rehash(T, T->n * 2);
165 uint32_t h = hash(value, len) % T->n;
167 hashed_value* u = T->A[h];
170 if (u->len == len && memcmp(u->value, value, len) == 0) {
178 u = malloc_or_die(sizeof(hashed_value));
179 u->value = malloc_or_die(len);
180 memcpy(u->value, value, len);
192 hashed_value** dump_hash_table(hash_table* T)
194 hashed_value** D = malloc_or_die(T->m * sizeof(hashed_value*));
198 for (i = 0, j = 0; i < T->n; i++) {