Optimize hashtable_set()
If a key already exists in the hashtable, use the existing pair changing its value instead of removing the old one and allocating a new pair.
This commit is contained in:
parent
8d75235ff2
commit
307167fb66
@ -247,31 +247,39 @@ int hashtable_set(hashtable_t *hashtable, void *key, void *value)
|
|||||||
bucket_t *bucket;
|
bucket_t *bucket;
|
||||||
unsigned int hash, index;
|
unsigned int hash, index;
|
||||||
|
|
||||||
hash = hashtable->hash_key(key);
|
|
||||||
|
|
||||||
/* if the key already exists, delete it */
|
|
||||||
hashtable_do_del(hashtable, key, hash);
|
|
||||||
|
|
||||||
/* rehash if the load ratio exceeds 1 */
|
/* rehash if the load ratio exceeds 1 */
|
||||||
if(hashtable->size >= num_buckets(hashtable))
|
if(hashtable->size >= num_buckets(hashtable))
|
||||||
if(hashtable_do_rehash(hashtable))
|
if(hashtable_do_rehash(hashtable))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
pair = malloc(sizeof(pair_t));
|
hash = hashtable->hash_key(key);
|
||||||
if(!pair)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
pair->key = key;
|
|
||||||
pair->value = value;
|
|
||||||
pair->hash = hash;
|
|
||||||
list_init(&pair->list);
|
|
||||||
|
|
||||||
index = hash % num_buckets(hashtable);
|
index = hash % num_buckets(hashtable);
|
||||||
bucket = &hashtable->buckets[index];
|
bucket = &hashtable->buckets[index];
|
||||||
|
pair = hashtable_find_pair(hashtable, bucket, key, hash);
|
||||||
|
|
||||||
insert_to_bucket(hashtable, bucket, &pair->list);
|
if(pair)
|
||||||
|
{
|
||||||
|
if(hashtable->free_key)
|
||||||
|
hashtable->free_key(key);
|
||||||
|
if(hashtable->free_value)
|
||||||
|
hashtable->free_value(pair->value);
|
||||||
|
pair->value = value;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pair = malloc(sizeof(pair_t));
|
||||||
|
if(!pair)
|
||||||
|
return -1;
|
||||||
|
|
||||||
hashtable->size++;
|
pair->key = key;
|
||||||
|
pair->value = value;
|
||||||
|
pair->hash = hash;
|
||||||
|
list_init(&pair->list);
|
||||||
|
|
||||||
|
insert_to_bucket(hashtable, bucket, &pair->list);
|
||||||
|
|
||||||
|
hashtable->size++;
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user