diff --git a/lib/hash.c b/lib/hash.c index 801871f839..66341cf2f1 100644 --- a/lib/hash.c +++ b/lib/hash.c @@ -141,18 +141,15 @@ void *hash_get(struct hash *hash, void *data, void *(*alloc_func)(void *)) unsigned int key; unsigned int index; void *newdata; - unsigned int len; struct hash_backet *backet; key = (*hash->hash_key)(data); index = key & (hash->size - 1); - len = 0; for (backet = hash->index[index]; backet != NULL; backet = backet->next) { if (backet->key == key && (*hash->hash_cmp)(backet->data, data)) return backet->data; - ++len; } if (alloc_func) { @@ -160,7 +157,7 @@ void *hash_get(struct hash *hash, void *data, void *(*alloc_func)(void *)) if (newdata == NULL) return NULL; - if (len > HASH_THRESHOLD) { + if (HASH_THRESHOLD(hash->count + 1, hash->size)) { hash_expand(hash); index = key & (hash->size - 1); } diff --git a/lib/hash.h b/lib/hash.h index 236abbbd6a..b6fe27e257 100644 --- a/lib/hash.h +++ b/lib/hash.h @@ -28,8 +28,9 @@ DECLARE_MTYPE(HASH) DECLARE_MTYPE(HASH_BACKET) /* Default hash table size. */ -#define HASH_INITIAL_SIZE 256 /* initial number of backets. */ -#define HASH_THRESHOLD 10 /* expand when backet. */ +#define HASH_INITIAL_SIZE 256 +/* Expansion threshold */ +#define HASH_THRESHOLD(used, size) ((used) > (size)) #define HASHWALK_CONTINUE 0 #define HASHWALK_ABORT -1