Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Looking for a good hash table implementation in C [closed]

I am primarily interested in string keys. Can someone point me towards a library?

like image 348
Setjmp Avatar asked Jul 16 '09 16:07

Setjmp


People also ask

Does C have built in hash table?

A Hash Table in C/C++ (Associative array) is a data structure that maps keys to values. This uses a hash function to compute indexes for a key. Based on the Hash Table index, we can store the value at the appropriate location.

Does C have Hashmaps?

The standard C library doesn't include any large, persistent data structures - neither lists, nor trees, nor stacks, nor hashtables.

How do you implement Hashtable?

Take an array and use the hash function to hash the 26 possible characters with indices of the array. Then iterate over S and increase the value of the current character of the string with the corresponding index for each character. The complexity of this hashing approach is O(N), where N is the size of the string.

What is a good choice for a hash function?

Choosing a good hashing function, h(k), is essential for hash-table based searching. h should distribute the elements of our collection as uniformly as possible to the "slots" of the hash table. The key criterion is that there should be a minimum number of collisions. will provide uniform hashing.


2 Answers

I had the same need and did some research and ended up using libcfu

It's simple and readable so if I have a need to modify, I can do it without spending too much time to understand. It's also of BSD license. No need to change my structs (to embed say a next pointer)

I had to reject the other options for following reasons (my personal reasons, YMMV):

  • sglib --> it's a macro maze and I wasn't comfortable debugging/making changes on such a code base using just macros
  • cbfalconer --> lot of licensing redflags, and the site was down and too many unfavorable discussions on web about support/author; didn't want to take the risk
  • google sparce-hash --> as stated already, it's for C++, not C
  • glib (gnome hash) --> looked very promising; but I couldn't find any easy way to install the developer kit; I just needed the C routines/files -- not the full blown developement environment
  • Judy --> seems too complex for a simple use.. also was not ready to debug myself if I had to run into any issues
  • npsml (mentioned here) --> can't find the source
  • strmap found very simple and useful -- it's just too simplistic that both key and value must be strings; value being string seems too restrictive (should accept void *)
  • uthash --> seems good (has been mentioned on wikipedia on hashtable); found that it requires struct to be modified -- didn't want to do that as performace is not really a concern for my use --it's more of development velocity.

In summary for very simple use strmap is good; uthash if you are concerned with additional memory use. If just speed of development or ease of use is primary objective, libcfu wins [note libcfu internally does memory allocation to maintain the nodes/hashtables]. It's surprising that there aren't many simple C hash implementations available.

like image 101
Karthik Gurusamy Avatar answered Sep 27 '22 19:09

Karthik Gurusamy


GLib is a great library to use as a foundation in your C projects. They have some decent data structure offerings including Hash Tables: http://developer.gnome.org/glib/2.28/glib-Hash-Tables.html (link updated 4/6/2011)

like image 37
Daniel M Avatar answered Sep 27 '22 19:09

Daniel M