我主要对字符串键感兴趣。有人可以将我指向图书馆吗?
Answers:
我有同样的需求,做了一些研究,最终使用了libcfu
它简单易读,因此,如果我需要进行修改,则无需花费太多时间来理解就可以进行修改。它也是BSD许可证。无需更改我的结构(嵌入说一个下一个指针)
由于以下原因(我个人原因,YMMV),我不得不拒绝其他选择:
总结来说,使用strmap非常简单。如果您担心额外的内存使用,则为uthash。如果仅以开发速度或易用性为主要目标,则libcfu会获胜[请注意libcfu在内部进行内存分配以维护节点/哈希表]。令人惊讶的是,没有很多简单的C哈希实现。
GLib是一个出色的库,可以用作您C项目的基础。他们提供了一些不错的数据结构产品,包括哈希表:http : //developer.gnome.org/glib/2.28/glib-Hash-Tables.html(链接更新于2011年4月6日)
对于字符串,Judy Array可能很好。
Judy数组是一种复杂但非常快速的关联数组数据结构,用于使用整数或字符串键存储和查找值。与普通数组不同,Judy数组可能是稀疏的。也就是说,它们可能具有大范围的未分配索引。
这里是一个朱迪库中Ç。
一个AC库,它提供了实现稀疏动态数组的最新核心技术。Judy数组仅使用空指针声明。Judy数组仅在填充时才消耗内存,但如果需要,可以增长以利用所有可用内存。
其他参考,
此Wikipedia哈希实现参考具有一些C
开源链接。
另外,cmph-中的最小完美哈希库C
支持多种算法。
戴夫·汉森(Dave Hanson)的C接口和实现 包括一个精细的哈希表和其他一些精心设计的数据结构。还有一个不错的字符串处理接口。如果您负担得起这本书,那是很好的书,但是即使没有,我也发现该软件设计得很好,足够小,可以全面学习,并且可以在多个不同的项目中重用。
自从我问这个问题以来已经过去了很长时间...现在我可以将自己的公共域库添加到列表中:
来自samtools / bwa / seqtk / klib的khash.h
卷曲https://raw.github.com/attractivechaos/klib/master/khash.h
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 ++,它们是值的关键。