hash: force size to be a power of 2

By forcing the hash table size to be a power of 2, a potentially
expensive divide can be replaced by a mask operation. Almost all
usage of the hash table was using default size of 1024. Only places
with different size was thread library (1011) and bgp aspath.

Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
This commit is contained in:
Stephen Hemminger 2013-01-04 22:29:21 +00:00 committed by David Lamparter
parent 44a86a0278
commit 90645f5598
4 changed files with 7 additions and 6 deletions

View File

@ -1856,7 +1856,7 @@ aspath_cmp (const void *arg1, const void *arg2)
void void
aspath_init (void) aspath_init (void)
{ {
ashash = hash_create_size (32767, aspath_key_make, aspath_cmp); ashash = hash_create_size (32768, aspath_key_make, aspath_cmp);
} }
void void

View File

@ -31,6 +31,7 @@ hash_create_size (unsigned int size, unsigned int (*hash_key) (void *),
{ {
struct hash *hash; struct hash *hash;
assert ((size & (size-1)) == 0);
hash = XMALLOC (MTYPE_HASH, sizeof (struct hash)); hash = XMALLOC (MTYPE_HASH, sizeof (struct hash));
hash->index = XCALLOC (MTYPE_HASH_INDEX, hash->index = XCALLOC (MTYPE_HASH_INDEX,
sizeof (struct hash_backet *) * size); sizeof (struct hash_backet *) * size);
@ -71,7 +72,7 @@ hash_get (struct hash *hash, void *data, void * (*alloc_func) (void *))
struct hash_backet *backet; struct hash_backet *backet;
key = (*hash->hash_key) (data); key = (*hash->hash_key) (data);
index = key % hash->size; index = key & (hash->size - 1);
for (backet = hash->index[index]; backet != NULL; backet = backet->next) for (backet = hash->index[index]; backet != NULL; backet = backet->next)
if (backet->key == key && (*hash->hash_cmp) (backet->data, data)) if (backet->key == key && (*hash->hash_cmp) (backet->data, data))
@ -125,7 +126,7 @@ hash_release (struct hash *hash, void *data)
struct hash_backet *pp; struct hash_backet *pp;
key = (*hash->hash_key) (data); key = (*hash->hash_key) (data);
index = key % hash->size; index = key & (hash->size - 1);
for (backet = pp = hash->index[index]; backet; backet = backet->next) for (backet = pp = hash->index[index]; backet; backet = backet->next)
{ {

View File

@ -41,7 +41,7 @@ struct hash
/* Hash backet. */ /* Hash backet. */
struct hash_backet **index; struct hash_backet **index;
/* Hash table size. */ /* Hash table size. Must be power of 2 */
unsigned int size; unsigned int size;
/* Key make function. */ /* Key make function. */

View File

@ -531,8 +531,8 @@ thread_master_create ()
{ {
if (cpu_record == NULL) if (cpu_record == NULL)
cpu_record cpu_record
= hash_create_size (1011, (unsigned int (*) (void *))cpu_record_hash_key, = hash_create ((unsigned int (*) (void *))cpu_record_hash_key,
(int (*) (const void *, const void *))cpu_record_hash_cmp); (int (*) (const void *, const void *))cpu_record_hash_cmp);
return (struct thread_master *) XCALLOC (MTYPE_THREAD_MASTER, return (struct thread_master *) XCALLOC (MTYPE_THREAD_MASTER,
sizeof (struct thread_master)); sizeof (struct thread_master));