BB#110 Replace hash function with Dan Bernstein's.

This hash function distributes much better than the
original one. The effect is not as visible with
hashes taken modulo 32 than with a bigger modulus,
but it is there. And larger number of buckets migh
become possible in the future...

Reviewed-by: Michael Adam <obnox@samba.org>
(cherry picked from commit ab6255393d)
This commit is contained in:
Peter H. Froehlich 2014-11-02 22:27:45 -05:00 committed by Michael Adam
parent 12c454119b
commit 132a32a68d

View File

@ -63,6 +63,9 @@ struct hashmap_s {
* The contents of the key are converted to lowercase, so this function
* is not case-sensitive.
*
* This is Dan Bernstein's hash function as described, for example, here:
* http://www.cse.yorku.ca/~oz/hash.html
*
* If any of the arguments are invalid a negative number is returned.
*/
static int hashfunc (const char *key, unsigned int size)
@ -74,12 +77,8 @@ static int hashfunc (const char *key, unsigned int size)
if (size == 0)
return -ERANGE;
for (hash = tolower (*key++); *key != '\0'; key++) {
uint32_t bit = (hash & 1) ? (1 << (sizeof (uint32_t) - 1)) : 0;
hash >>= 1;
hash += tolower (*key) + bit;
for (hash = 5381; *key != '\0'; key++) {
hash = ((hash << 5) + hash) ^ tolower (*key);
}
/* Keep the hash within the table limits */