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:
parent
12c454119b
commit
132a32a68d
@ -63,6 +63,9 @@ struct hashmap_s {
|
|||||||
* The contents of the key are converted to lowercase, so this function
|
* The contents of the key are converted to lowercase, so this function
|
||||||
* is not case-sensitive.
|
* 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.
|
* If any of the arguments are invalid a negative number is returned.
|
||||||
*/
|
*/
|
||||||
static int hashfunc (const char *key, unsigned int size)
|
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)
|
if (size == 0)
|
||||||
return -ERANGE;
|
return -ERANGE;
|
||||||
|
|
||||||
for (hash = tolower (*key++); *key != '\0'; key++) {
|
for (hash = 5381; *key != '\0'; key++) {
|
||||||
uint32_t bit = (hash & 1) ? (1 << (sizeof (uint32_t) - 1)) : 0;
|
hash = ((hash << 5) + hash) ^ tolower (*key);
|
||||||
|
|
||||||
hash >>= 1;
|
|
||||||
|
|
||||||
hash += tolower (*key) + bit;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Keep the hash within the table limits */
|
/* Keep the hash within the table limits */
|
||||||
|
Loading…
Reference in New Issue
Block a user