在C中寻找良好的哈希表实现[关闭]


Answers:


58

我有同样的需求,做了一些研究,最终使用了libcfu

它简单易读,因此,如果我需要进行修改,则无需花费太多时间来理解就可以进行修改。它也是BSD许可证。无需更改我的结构(嵌入说一个下一个指针)

由于以下原因(我个人原因,YMMV),我不得不拒绝其他选择:

  • sglib->这是一个宏迷宫,我不习惯使用宏在这样的代码库上调试/进行更改
  • cbfalconer->大量许可危险信号,并且该站点已关闭,并且网络上有关支持/作者的讨论太多;不想冒险
  • google sparce-hash->如前所述,它用于C ++,而不是C
  • glib(gnome哈希)->看起来很有希望;但是我找不到安装开发人员工具包的任何简便方法;我只需要C例程/文件-不需要全面的开发环境
  • Judy->似乎太简单了,无法使用..如果我遇到任何问题,也没有准备好调试自己。
  • npsml(在这里提到)->找不到源
  • strmap发现非常简单和有用-键和值都必须是字符串,这太简单了;字符串形式的值似乎过于严格(应该接受void *)
  • uthash- >看起来不错(在Wikipedia的hashtable上已经提到过);发现需要修改结构-不想这样做,因为性能并不是我的使用担心-它的发展速度更大。

总结来说,使用strmap非常简单。如果您担心额外的内存使用,则为uthash。如果仅以开发速度或易用性为主要目标,则libcfu会获胜[请注意libcfu在内部进行内存分配以维护节点/哈希表]。令人惊讶的是,没有很多简单的C哈希实现。


2
我注意到uthash似乎比libcfu(2005年份)更加活跃。也许对于一小段代码来说这不是问题-自从发布这篇文章以来,您是否遇到过其他竞争者?
bph 2012年

我有一个庞大的数据集,而glib不支持该大数据(32位密钥)。我需要的不仅仅是glib。libcfu呢?
13年

libcfu链接显示错误...
zippy

1
CPython中的哈希表实现基于libcfu:github.com/python/cpython/blob/master/Modules/hashtable.c
Ryan Li

16

GLib是一个出色的库,可以用作您C项目的基础。他们提供了一些不错的数据结构产品,包括哈希表:http : //developer.gnome.org/glib/2.28/glib-Hash-Tables.html(链接更新于2011年4月6日)


+1:Glib确实是一个很棒的库。
Stefano Borini

1
我是否认为您通常动态链接到glib库以使用这些数据结构,如果从linux迁移到Windows,可能会导致移植问题?
bph 2012年

Glib仅支持32位。如果您处理海量数据,那么glib将不是一个很好的选择
Baskaya

8

对于字符串,Judy Array可能很好。

Judy数组是一种复杂但非常快速的关联数组数据结构,用于使用整数或字符串键存储和查找值。与普通数组不同,Judy数组可能是稀疏的。也就是说,它们可能具有大范围的未分配索引。

这里是一个朱迪库Ç

一个AC库,它提供了实现稀疏动态数组的最新核心技术。Judy数组仅使用空指针声明。Judy数组仅在填充时才消耗内存,但如果需要,可以增长以利用所有可用内存。


其他参考,
Wikipedia哈希实现参考具有一些C开源链接。
另外,cmph-中的最小完美哈希库C支持多种算法。



5

戴夫·汉森(Dave Hanson)的C接口和实现 包括一个精细的哈希表和其他一些精心设计的数据结构。还有一个不错的字符串处理接口。如果您负担得起这本书,那是很好的书,但是即使没有,我也发现该软件设计得很好,足够小,可以全面学习,并且可以在多个不同的项目中重用。


ang!我需要买这个!
kirbyfan64sos



3

Apache的APR库具有自己的哈希实现。它已经被移植到Apache运行的任何东西,并且Apache许可证也相当自由。


对于C编程,这似乎是一个切实可行的选择。它拥有一切,已被广泛使用和测试,并且有据可查..
minghua 2013年

3

来自samtools / bwa / seqtk / klib的khash.h

卷曲https://raw.github.com/attractivechaos/klib/master/khash.h

通过http://www.biostars.org/p/10353/


2
尽管khash看起来很高效,但它缺少的一件事就是使用的文档/玩具示例……
Andy Hayden 2013年

这里有示例biostars.org/p/10353
Alex

2
我看到一个示例,该示例不提供任何解释,并且与文档类似,它具有一个字母的非描述性变量名称,并且没有注释。这很烦人,因为毫无疑问它在做一些简单的事情。
安迪·海登


2

下载tcl并使用其久经考验的tcl哈希函数。这很容易。TCL API有详细记录。



0

https://github.com/dozylynx/C-hashtable

[更新的URL现在为原始404:http://www.cl.cam.ac.uk/~cwc22/hashtable/ ]

定义功能

使用例


7
404错误。请您更新链接吗?
徐强

我是上述哈希表的作者。该代码位于:github.com/dozylynx/C-hashtable
xtopher

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.