#include <libetpan/libetpan.h> typedef struct chash chash; typedef struct chashcell chashiter; typedef struct { char * data; int len; } chashdatum;
chash is a hash table. chashiter is a pointer to an element of the hash table. chashdatum is an element to be placed in the hash table as a key or a value. It consists in data and a corresponding length.
#define CHASH_COPYNONE 0 #define CHASH_COPYKEY 1 #define CHASH_COPYVALUE 2 #define CHASH_COPYALL (CHASH_COPYKEY | CHASH_COPYVALUE) chash * chash_new(int size, int flags); void chash_free(chash * hash);
chash_new() returns a new empty hash table or NULL if this failed. size is the initial size of the table used for implementation. flags can be a combinaison of CHASH_COPYKEY and CHASH_COPYVALUE. CHASH_COPYKEY enables copy of key, so that the initial value used for chash_set()
chash_free() releases memory used by the hash table.
int chash_set(chash * hash, chashdatum * key, chashdatum * value, chashdatum * oldvalue); int chash_get(chash * hash, chashdatum * key, chashdatum * result);
chash_set() adds a new element into the hash table. If a previous element had the same key, it is returns into oldvalue if oldvalue is different of NULL. Medium complexity is O(1).
returns -1 if it fails, 0 on success.
chash_get()returns the corresponding value of the given key. If there is no corresponding value, -1 is returned. 0 on success. Medium complexity is O(1).
Example 2-9. chash insert and lookup
int main(void) { chash * hash; int r; chashdatum key; chashdatum value; char * str1 = "my-data"; char * str2 = "my-data"; hash = chash_new(CHASH_DEFAULTSIZE, CHASH_COPYNONE); key.data = "foo"; key.len = strlen("foo"); value.data = str1; value.data = strlen(str1) + 1; /* + 1 is needed to get the terminal zero in the returned string */ r = chash_set(hash, &key, &value, NULL); if (r < 0) goto free_hash; key.data = "bar"; key.len = strlen("bar"); value.data = str2; value.data = strlen(str2) + 1; if (r < 0) goto free_hash; key.data = "foo"; key.len = strlen("foo"); r = chash_get(hash, &key, &value); if (r < 0) { printf("element not found\n"); } else { char * str; str = value.data; printf("found : %s", str); } chash_free(hash); exit(EXIT_SUCCESS); free_hash: chash_free(hash); err: exit(EXIT_FAILURE); }
int chash_delete(chash * hash, chashdatum * key, chashdatum * oldvalue);
deletes the key/value pair given the corresponding key. The value is returned in old_value. If there is no corresponding value, -1 is returned. 0 on success. Medium complexity is O(1).
Example 2-10. key deletion in a chash
int main(void) { chash * hash; int r; chashdatum key; chashdatum value; char * str1 = "my-data"; char * str2 = "my-data"; hash = build_hash(); key.data = "foo"; key.len = strlen("foo"); chash_delete(hash, &key, &value); /* it will never be possible to lookup "foo" */ key.data = "foo"; key.len = strlen("foo"); r = chash_get(hash, &key, &value); if (r < 0) { printf("element not found\n"); } else { char * str; str = value.data; printf("found : %s", str); } chash_free(hash); exit(EXIT_SUCCESS); free_hash: chash_free(hash); err: exit(EXIT_FAILURE); }
int chash_resize(chash * hash, int size);
chash_resize() changes the size of the table used for implementation of the hash table. returns 0 on success, -1 on failure.
chashiter * chash_begin(chash * hash); chashiter * chash_next(chash * hash, chashiter * iter); void chash_key(chashiter * iter, chashdatum * result); void chash_value(chashiter iter, chashdatum * result);
chash_begin() returns a pointer to the first element of the hash table. Returns NULL if there is no elements in the hash table. Complexity is O(n).
chash_next() returns a pointer to the next element of the hash table. Returns NULL if there is no next element. Complexity is O(n) but n calls to chash_next() also has a complexity of O(n).
chash_key() returns the key of the given element of the hash table.
chash_value returns the value of the given element of the hash table.
Example 2-11. running through a chash
int main(void) { chash * hash; int r; chashiter * iter; hash = build_hash(); /* this will display all the values stored in the hash */ for(iter = chash_begin(hash) ; iter != NULL ; iter = chash_next(hash, iter)) { chashdatum key; chashdatum value; char * str; chash_value(iter, &value); str = value.data; printf("%s\n", str); } chash_free(hash); }
int chash_size(chash * hash); int chash_count(chash * hash);
chash_size() returns the size of the table used for implementation of the hash table. Complexity is O(1).
chash_count() returns the number of elements in the hash table. Complexity is O(1).