我主要对字符串键感兴趣。有人能指向我的图书馆吗?在C中寻找一个好的散列表实现
回答
对于字符串,Judy Array可能是好的。
Judy数组是一个复杂但速度非常快的关联数组结构,用于使用整数或字符串键存储和查找值。与普通数组不同,Judy数组可能很稀疏;也就是说,它们可能有大量未分配的索引。
这里是一个Judy library in C。
提供实现稀疏动态数组的最先进核心技术的C库。 Judy数组被声明为一个空指针。 Judy数组只有在填充时才会消耗内存,但如果需要,它可以增长以充分利用所有可用内存。
其他参考资料,
这Wikipedia hash implementation reference有一些C
开放源代码的链接。
另外,cmph - 在C
最小完美散列库,支持几种算法。
从未使用过它,但Google Sparsehash可能工作
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)" */
404错误。你会更新链接吗? – 2013-01-04 21:12:19
下载tcl和使用他们的时间证明TCL散列函数。这很容易。 TCL API是有据可查的。
C Interfaces and Implementations讨论了C中的哈希表实现。源代码是available online。 (我的书的副本是在工作,所以我不能更具体)。
感谢您介绍本书。刚刚在亚马逊下了订单。 – 2013-01-04 21:11:20
GLib是一个伟大的图书馆,作为您的C项目的基础。他们有一些不错的数据结构产品,包括哈希表:http://developer.gnome.org/glib/2.28/glib-Hash-Tables.html(链接更新2011年4月6日)
的gperf - 完美的哈希函数发生器
http://www.ibm.com/developerworks/linux/library/l-gperf.html
戴夫·汉森的C Interfaces and Implementations包括罚款哈希表和几个其他精心设计的数据结构。还有一个不错的字符串处理界面。如果你负担得起,这本书是非常棒的,但即使没有,我也发现这个软件设计得非常好,足够小,可以完整地学习,并且可以轻松地在几个不同的项目中重复使用。
stl具有map和hash_map(hash_map仅在某些实现中),如果您能够使用C++,它们是值的关键。
,因为我问这个问题很长一段时间已经过去了......现在我可以我自己的公共域库添加到列表:
我有同样的需求,做了一些研究,并最终使用libcfu
它简单易读,所以如果我需要修改,我可以做到这一点,而无需花费太多时间来理解。它也是BSD许可证。无需改变我的结构(以嵌入说下一个指针)
我不得不拒绝理由如下(我个人的原因,情况因人而异)其它选项:
- sglib - >这是宏迷宫我很不习惯使用宏来调试/制作 这样一个代码库的变化
- cbfalconer - >很多许可redflags,并且该网站被关闭并且在网上关于支持/作者的讨论太多;不想承担风险
- google sparce-hash - >如前所述,这是针对C++的,而不是C
- glib(gnome hash) - >看起来非常有前途;但我找不到安装开发工具包的简单方法;我只需要在C例程/文件 - 而不是完全成熟的研究与开发环境
- 朱迪 - >似乎是一个简单的使用太复杂..还没有准备调试自己,如果我不得不遇到任何问题
- npsml(在这里提到) - >找不到源
- strmap发现非常简单和有用 - 它太简单了,键和值都必须是字符串;价值是字符串似乎太限制(应接受无效*)
- uthash - >似乎很好(已在维基百科上提到散列表);发现它需要对结构进行修改 - 不想这样做,因为性能并不是我使用的关注点 - 它更多的是开发速度。
总结为非常简单的使用strmap是好的; uthash如果你关心额外的内存使用。如果只是开发速度或易用性是主要目标,libcfu会胜出[注意libcfu在内部做内存分配以维护节点/散列表]。令人惊讶的是没有很多简单的C哈希实现可用。
Apache的APR库有自己的hash-implementation。它已经被移植到Apache运行的任何东西上,并且Apache license也相当自由。
khash。从samtools H/BWA/seqtk/klib
卷曲https://raw.github.com/attractivechaos/klib/master/khash.h
- 1. C的散列表实现C
- 2. 在C#中寻找后缀树实现?
- 3. 寻找一个好的VBA树形图实现
- 4. C++ Blowfish散列实现
- 5. 寻找一个列表的内容,在另一个列表
- 6. 寻找一个中等强度的散列函数
- 7. 在C++中寻找好的调试器
- 8. 寻找一个离散函数的逆
- 9. 寻找一个无界的,基于队列,并实现为java.util.Set
- 10. 寻找这个单元测试的更好的实现
- 11. 寻找一个能同时访问多个数据库的好实现
- 12. 实现一个好的C++ 0x error_condition?
- 13. 如何在c中的链表中实现一个队列?
- 14. 寻找一个C#的LINQ
- 15. 好散列码,等于一个具有多个整数值的键的实现
- 16. C散列表实现中的内存泄漏
- 17. 在C++中实现在无向图算法中寻找循环
- 18. 寻找一个快速的散列函数
- 19. 在C++中寻找一个MemoryStream
- 20. 在C中寻找一个自然数#
- 21. 寻找一个好的数据库结构来实现Facebook/SO的通知
- 22. 在C++中寻找二叉树的实现
- 23. 在C++中实现一个类似Python的列表
- 24. 寻找一个好的地图定义,如果地图可以用树实现
- 25. 寻找一个好的Mootools Javascript教程
- 26. 寻找一个很好的parse.com替代
- 27. 德尔福5的散列表实现
- 28. C#散列表与C++散列表
- 29. 列表查找,Hashset或Linq哪一个更好在列表中
- 30. 寻找在其中一个列表中的任何元素在另一个
我认为sparsehase用C++编写。 – 2009-07-16 16:37:16
我认为你是对的 – Nick 2009-07-16 17:14:41
事实上,在这种情况下C是感兴趣的语言 - 而不是C++。 – SetJmp 2009-07-17 00:37:34