在C语言中寻找一个好的哈希表实现

73

我主要关注字符串键。有人可以指向一个库吗?

14个回答

61

我有同样的需求,做了一些研究后决定使用libcfu

它很简单易读,如果我需要修改,不需要花太多时间去理解。它还是BSD许可证。没有必要改变我的结构体(例如嵌入一个next指针)

以下是我拒绝其他选项的原因(个人原因,可能会因人而异):

  • sglib --> 海量的宏使我无法舒适地调试和进行更改。
  • cbfalconer --> 许多许可证方面的红旗,并且网站已经关闭,网络上关于支持/作者的讨论过多;我不想冒险尝试。
  • google sparce-hash --> 如前所述,它是用于C++而不是C的。
  • glib (gnome hash) --> 看起来非常有前途;但我找不到安装开发工具包的简便方法;我只需要C例程/文件--而不是完整的开发环境。
  • Judy --> 对于简单的用途来说似乎太复杂了.. 如果遇到任何问题需要自己调试,我也不准备这么做。
  • npsml(在此提到)--> 找不到源代码
  • strmap 非常简单和有用--它太过简单,仅接受字符串作为键和值;值为字符串似乎太限制了(应该接受void *)
  • uthash --> 看起来很好(在哈希表上已经在维基百科上提到);发现它需要修改结构体--我不想这样做,因为性能并不是我的关注点--更多的是开发速度。

简而言之,如果只是简单使用,strmap 是不错的选择;如果您担心额外的内存使用,可以使用 uthash。如果开发速度或易用性是主要目标,libcfu 胜出 [请注意,libcfu 在内部进行内存分配以维护节点/哈希表]。令人惊讶的是,没有太多简单的 C 语言哈希表实现。


3
我注意到 Uthash 似乎比 Libcfu(2005 年的版本)更活跃地开发着。不过这可能对于少量代码来说并不是问题——自从那篇帖子发布以来,你是否遇到了其他类似的选择? - bph
我有一个庞大的数据集,而glib不支持这么大的数据(32位键)。我需要比glib更多的东西。libcfu怎么样? - Baskaya
libcfu链接显示错误... - zippy
1
CPython中的哈希表实现基于libcfu:https://github.com/python/cpython/blob/master/Modules/hashtable.c - Ryan Li
Libcfu的文档:http://libcfu.sourceforge.net/libcfu.html - Zhou Hongbo
最终我选择在Android上使用UTHash。一些注意事项:如果出现switch标签之间的fall-through,请使用#pragma GCC diagnostic ignored "-Wimplicit-fallthrough";如果出现填充结构体'struct UT_hash_table'以对齐'tail'的4个字节,请参见https://github.com/troydhanson/uthash/issues/118#issue-223582662。 - Zhou Hongbo

16

+1:GLib确实是一个很棒的库。 - Stefano Borini
1
我想问一下,您通常是否动态链接到GLib库以使用这些数据结构,如果从Linux移植到Windows可能会产生移植问题,我的理解是正确的吗? - bph
GLib仅支持32位。如果您处理大量数据,GLib将不是一个好选择。 - Baskaya

8
对于字符串,Judy数组可能是一个不错的选择。
Judy数组是一种复杂但非常快速的关联数组数据结构,可使用整数或字符串键存储和查找值。与普通数组不同,Judy数组可以是稀疏的;也就是说,它们可能具有大量未分配索引的范围。
这里有一个用C编写的Judy库
Judy库是一个提供最先进核心技术的C库,实现了一种稀疏动态数组。Judy数组只需使用空指针声明即可。当Judy数组被填充时,它才会占用内存,但如果需要,它可以增长以利用所有可用内存。
其他参考资料, 这个Wikipedia哈希实现参考有一些C开源链接。 另外,cmph——一个在C中支持多种算法的最小完美哈希库。

5


5

Dave Hanson的 C接口与实现 包含了一个很好的哈希表和其他几个精心设计的数据结构。此外,还有一个不错的字符串处理接口。如果你能承担得起这本书,它是非常棒的,但即使没有,我发现这个软件设计得非常好,足够小,可以完全学习,并且易于在多个不同的项目中重复使用。


该死!我需要买这个! - kirbyfan64sos

4

感谢介绍这本书,我已经在亚马逊下单了。 - Qiang Xu

3

这似乎是C编程的一个非常实用的选择。它拥有一切,被广泛使用和测试,文档齐全,.. - minghua

3

2
尽管Khash看起来非常高效,但它缺乏文档/使用示例。 - Andy Hayden
这是关于编程的相关内容,请参考以下链接中的示例:http://www.biostars.org/p/10353/ - alex
2
我看到一个例子,它没有提供任何解释,与文档类似,它有一个字母的非描述性变量名和没有注释。这很让人恼火,因为毫无疑问它正在执行一些简单的操作。 - Andy Hayden

2

2
我认为sparsehase是用C++编写的。 - Kirill V. Lyadvinsky
1
在这种情况下,确实,C是感兴趣的语言--而不是C++。 - Setjmp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接