On Mon, 2012-01-30 at 02:22 +1100, Bojan Smojver wrote: > we could run the hash value produced by hashing the strings through > the hash function twice
Like this. -- Bojan
Index: tables/apr_hash.c =================================================================== --- tables/apr_hash.c (revision 1237208) +++ tables/apr_hash.c (working copy) @@ -288,11 +288,12 @@ const void *val) { apr_hash_entry_t **hep, *he; - unsigned int hash; - apr_ssize_t hlen = sizeof(hash); + unsigned int hash, temp; + apr_ssize_t hlen = sizeof(unsigned int); - hash = ht->hash_func(key, &klen); - hash = hashfunc_default((char *)&hash, &hlen, ht->seed); + temp = ht->hash_func(key, &klen); + hash = hashfunc_default((char *)&temp, &hlen, ht->seed); + hash = hashfunc_default((char *)&temp, &hlen, hash); /* scan linked list */ for (hep = &ht->array[hash & ht->max], he = *hep; @@ -432,8 +433,8 @@ apr_hash_entry_t *new_vals = NULL; apr_hash_entry_t *iter; apr_hash_entry_t *ent; - unsigned int i, j, k, hash; - apr_ssize_t hlen = sizeof(hash); + unsigned int i, j, k, hash, temp; + apr_ssize_t hlen = sizeof(unsigned int); #if APR_POOL_DEBUG /* we don't copy keys and values, so it's necessary that @@ -483,8 +484,9 @@ for (k = 0; k <= overlay->max; k++) { for (iter = overlay->array[k]; iter; iter = iter->next) { - hash = res->hash_func(iter->key, &iter->klen); - hash = hashfunc_default((char*)&hash, &hlen, res->seed); + temp = res->hash_func(iter->key, &iter->klen); + hash = hashfunc_default((char*)&temp, &hlen, res->seed); + hash = hashfunc_default((char*)&temp, &hlen, hash); i = hash & res->max; for (ent = res->array[i]; ent; ent = ent->next) { if ((ent->klen == iter->klen) &&