From 56fa1c897b84e3ae4c2849285def19575dd27611 Mon Sep 17 00:00:00 2001 From: mquinson Date: Tue, 22 Aug 2006 22:27:24 +0000 Subject: [PATCH] Implement a dict_hash_ext function able to deal with non-null-terminated strings so that we can use the version written by Christophe in dict_get, where we assume that the string is null-terminated and don't want to pay a strlen for nothing git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@2731 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- src/xbt/dict.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/xbt/dict.c b/src/xbt/dict.c index c97f224a32..a51a2abe1f 100644 --- a/src/xbt/dict.c +++ b/src/xbt/dict.c @@ -127,7 +127,7 @@ void xbt_dict_hashsize_set(xbt_dict_t dict, int hashsize) { /** * Returns the hash code of a string. */ -static unsigned int xbt_dict_hash(const char *str, int str_len) { +static unsigned int xbt_dict_hash_ext(const char *str, int str_len) { /* fast implementation of djb2 algorithm */ unsigned int hash = 5381; int c; @@ -140,6 +140,18 @@ static unsigned int xbt_dict_hash(const char *str, int str_len) { return hash; } +static unsigned int xbt_dict_hash(const char *str) { + /* fast implementation of djb2 algorithm */ + unsigned int hash = 5381; + int c; + + while ( (c = *str++) ) { + hash = ((hash << 5) + hash) + c; /* hash * 33 + c */ + } + + return hash; +} + /** * \brief Add data to the dict (arbitrary key) * \param dict the container @@ -159,7 +171,7 @@ void xbt_dict_set_ext(xbt_dict_t dict, void_f_pvoid_t *free_ctn) { xbt_assert(dict); - unsigned int hash_code = xbt_dict_hash(key,key_len) % dict->table_size; + unsigned int hash_code = xbt_dict_hash_ext(key,key_len) % dict->table_size; xbt_dictelm_t current, previous = NULL; current = dict->table[hash_code]; @@ -227,7 +239,7 @@ void *xbt_dict_get_ext(xbt_dict_t dict, int key_len) { xbt_assert(dict); - unsigned int hash_code = xbt_dict_hash(key,key_len) % dict->table_size; + unsigned int hash_code = xbt_dict_hash_ext(key,key_len) % dict->table_size; xbt_dictelm_t current; current = dict->table[hash_code]; @@ -306,7 +318,7 @@ void xbt_dict_remove_ext(xbt_dict_t dict, int key_len) { xbt_assert(dict); - unsigned int hash_code = xbt_dict_hash(key,key_len) % dict->table_size; + unsigned int hash_code = xbt_dict_hash_ext(key,key_len) % dict->table_size; xbt_dictelm_t current, previous = NULL; current = dict->table[hash_code]; @@ -385,7 +397,7 @@ int xbt_dict_length(xbt_dict_t dict) { void xbt_dict_add_element(xbt_dict_t dict, xbt_dictelm_t element) { xbt_assert(dict); - int hashcode = xbt_dict_hash(element->key,element->key_len) % dict->table_size; + int hashcode = xbt_dict_hash_ext(element->key,element->key_len) % dict->table_size; element->next = dict->table[hashcode]; dict->table[hashcode] = element; } -- 2.20.1