我主要对字符串键感兴趣。有人可以指出我去图书馆吗?
我有相同的需求,做了一些研究,最终使用了libcfu
它简单易读,因此,如果我需要进行修改,则无需花费太多时间来理解即可。它也是BSD许可证。无需更改我的结构(嵌入说一个下一个指针)
我出于以下原因(我个人原因,YMMV)不得不拒绝其他选择:
总结来说,使用strmap非常简单;如果您担心额外的内存使用,则为uthash。如果仅以开发速度或易用性为主要目标,则libcfu会获胜[请注意libcfu在内部进行内存分配以维护节点/哈希表]。令人惊讶的是,没有很多简单的C哈希实现。
从未使用过,但Google Sparsehash可能起作用
下载tcl,并使用其经过时间验证的tcl哈希函数。这很容易。 TCL API有详细记录。
Gperf-完美的哈希函数生成器
http://www.ibm.com/developerworks/linux/library/l-gperf.html
https://github.com/dozylynx/C-hashtable
[[已更新的URL现在是原始404:http://www.cl.cam.ac.uk/~cwc22/hashtable/]
定义的功能
* create_hashtable
* hashtable_insert
* hashtable_search
* hashtable_remove
* hashtable_count
* hashtable_destroy
使用示例
struct hashtable *h;
struct some_key *k;
struct some_value *v;
static unsigned int hash_from_key_fn( void *k );
static int keys_equal_fn ( void *key1, void *key2 );
h = create_hashtable(16, hash_from_key_fn, keys_equal_fn);
insert_key = (struct some_key *) malloc(sizeof(struct some_key));
retrieve_key = (struct some_key *) malloc(sizeof(struct some_key));
v = (struct some_value *) malloc(sizeof(struct some_value));
(You should initialise insert_key, retrieve_key and v here)
if (! hashtable_insert(h,insert_key,v) )
{ exit(-1); }
if (NULL == (found = hashtable_search(h,retrieve_key) ))
{ printf("not found!"); }
if (NULL == (found = hashtable_remove(h,retrieve_key) ))
{ printf("Not found\n"); }
hashtable_destroy(h,1); /* second arg indicates "free(value)" */
stl具有map和hash_map(hash_map仅在某些实现中),如果您能够使用C ++,它们是值的关键。
GLib是一个很棒的库,可以用作您C项目的基础。他们提供了一些不错的数据结构产品,包括哈希表:http://developer.gnome.org/glib/2.28/glib-Hash-Tables.html(链接更新4/6/2011)
对于字符串,Judy Array可能不错。
Judy数组是一个复杂但非常快速的关联数组数据结构,用于使用整数或字符串键存储和查找值。与普通数组不同,Judy数组可能是稀疏的。也就是说,它们可能具有大范围的未分配索引。
一个C库,提供了实现稀疏动态数组的最新核心技术。 Judy数组仅使用空指针声明。 Judy数组仅在填充时才消耗内存,但如果需要,可以增长为利用所有可用内存。
其他参考文献,此Wikipedia hash implementation reference具有一些C
开源链接。此外,cmph-C
中的最小完美哈希库支持多种算法。
Dave Hanson的C Interfaces and Implementations包括一个精细的哈希表和其他一些精心设计的数据结构。还有一个不错的字符串处理接口。如果您负担得起这本书,那是很棒的书,但是即使没有,我也发现该软件设计得很好,足够小,可以全面学习,并且可以在多个不同的项目中轻松使用。
自从我问这个问题以来已经过去了很长时间...现在我可以将自己的公共域库添加到列表中:
C Interfaces and Implementations讨论了C语言中的哈希表实现。源代码为available online。 (我的书的副本正在使用中,所以我不能再具体了。)
Apache的APR库具有自己的hash-implementation。它已经被移植到Apache运行的任何设备上,并且Apache license也相当自由。
samtools / bwa / seqtk / klib中的khash.h