Home

GEONius.com
6-Jan-2004
E-mail

hash_util - Hash Search Utilities

The HASH_UTIL package provides a means of building hash tables and performing hash searches.

The classic representation of hash tables is used for these hash tables. An array of buckets is created by hashCreate(), sized to the first prime number M that is larger than the expected maximum number of elements in the table. Key-value pairs are then added to the table by hashAdd(). A character string key is "folded" into an integer and divided by the prime number M to produce an index into the array of buckets; the key-value pair is then stored in the indicated bucket. If multiple key-value pairs map into the same bucket (a collision), they are chained together by a linked list attached to the bucket.

Building a hash table using these functions is very simple. First, create an empty hash table:

    #include  "hash_util.h"		-- Hash table definitions.
    #define  NUM_ITEMS  500
    HashTable  table ;
    ...
    hashCreate (NUM_ITEMS, 0, &table) ;

The first argument to hashCreate() is the expected number of items in the table; the table will handle more, albeit with slower lookup times.

Key-value pairs are added to the table with hashAdd():

    hashAdd (table, "key", (void *) value) ;

Keys are null-terminated characters strings and values must be cast as void * pointers. If the key is already in the table, its old value is replaced with the new value.

Looking up the value of a key is done with hashSearch():

    void  *value ;
    ...
    if (hashSearch (table, "key", &value))
        ... found ...
    else
        ... not found ...

The value is returned as a void * pointer, which the caller must then cast back to the original type.

The keys in a hash table can be retrieved by index:

    char  *key ;
    int  i ;
    void  *value ;
    ...
    for (i = 0 ;  i < hashCount (table) ;  i++) {
        key = hashGet (table, i) ;
        value = hashFind (table, key) ;
        printf ("%s = %p\n", key, value) ;
    }

Key-value pairs can be individually deleted from a hash table:

    hashDelete (table, "key") ;

or the entire table can be destroyed:

    hashDestroy (table) ;

The HASH_UTIL group of hash table functions offer several advantages over the Standard C Library hashing functions (hcreate(3), hdestroy(3), and hsearch(3)). First, the HASH_UTIL functions are easier to use: the multi-purpose functionality of hsearch(3) is broken up into hashAdd() and hashSearch(), etc. Second, the HASH_UTIL functions allow for more than one hash table in a program.


Public Procedures

hashAdd() - adds a key-data pair to a hash table.
hashCount() - returns the number of key-data pairs in a hash table.
hashCreate() - creates an empty hash table.
hashDelete() - deletes a key-data pair from a hash table.
hashDestroy() - deletes a hash table.
hashDump() - dumps a hash table.
hashFind() - locates a key in a hash table and returns the data value associated with the key.
hashGet() - retrieves the i-th key in a hash table.
hashSearch() - locates a key in a hash table and returns the data value associated with the key.
hashStatistics() - displays various statistics for a hash table.

Source Files

hash_util.c
hash_util.h

(See libgpl for the complete source, including support routines and build files.)


Alex Measday  /  E-mail