Looking for a good hash table implementation in C

2019-06-14 17:59发布

我在字符串键感兴趣。 有人能指出我朝着库?

Answer 1:

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

它的简单性和可读性,所以如果我有需要修改,我可以不用花太多时间去了解。 这是BSD许可证也。 无需改变我的结构(以嵌入说下一个指针)

我不得不拒绝理由如下(我个人的原因,情况因人而异)其它选项:

  • sglib - >这是宏迷宫,我不舒服调试/制作只用宏这样的代码库的变化
  • cbfalconer - >大量授权redflags,而网站已经关闭,并在有关支持/作者网站太多不利的讨论; 不想冒这个险
  • 谷歌sparce哈希 - >如前所述,它是C ++,不是C
  • 巧舌如簧(GNOME哈希) - >看起来非常有前途的; 但我无法找到任何简单的方法来安装开发工具包; 我只需要在C例程/文件 - 而不是完全成熟的研究与开发环境
  • 朱迪 - >似乎是一个简单的使用太复杂..还没有准备调试自己,如果我不得不遇到任何问题
  • npsml(这里提到) - >无法找到源
  • strmap发现非常简单而有用的-它只是过于简单化,这两个键和值必须是字符串; 值是字符串似乎限制过多(应该接受无效*)
  • uthash - >似乎不错(已对哈希表维基百科中提到); 发现它需要结构被修改 - 不想做,因为服务表现是不是真的为我用一个问题--IT是更多的发展速度。

总之非常简单的使用strmap好; 如果你所关心的更多的内存使用uthash。 如果开发或易用性不仅仅是速度是首要目标,libcfu胜[注意libcfu内部做内存分配,以保持节点/哈希表。 这是令人惊讶的是有没有的许多简单的C哈希实现。



Answer 2:

GLib的是在你的C项目的基础,使用一个伟大的图书馆。 他们有一些不错的数据结构产品,包括哈希表: http://developer.gnome.org/glib/2.28/glib-Hash-Tables.html (链接更新2011年4月6日)



Answer 3:

对于字符串,在朱迪阵列可能是很好的。

甲朱迪矩阵是用于存储和查找使用整数或字符串键值的复杂的但非常快的关联阵列。 不同于一般的阵列,朱迪阵列可以是稀疏; 也就是说,他们可能有未分配指标的大范围。

这是一个用C 朱迪库

AC库,提供国家的最先进的核心技术,它实现一个稀疏动态数组。 朱迪数组被简单地用一个空指针。 一个朱迪阵列消耗内存只有当它被填充,但可以长如果需要采取所有可用内存的优势。


其他参考资料,
这维基百科哈希实现参考有一些C开放源代码的链接。
此外, CMPH -最小完美哈希函数库中C ,支持多种算法。



Answer 4:

这里有一些很好的答案:
容器类/库对于C

http://sglib.sourceforge.net 。
http://cbfalconer.home.att.net/download/



Answer 5:

戴夫·汉森的I2C接口和实施包括罚款哈希表和其他几个精心设计的数据结构。 还有一个很好的字符串处理接口。 这本书是伟大的,如果你能负担得起,但即使没有,我发现这个软件设计得非常好,小的全部学习,且易于几个不同的项目重用。



Answer 6:

很长一段时间已经过去了,因为我问这个问题......我可以我自己的公共领域库现在添加到列表:

http://sourceforge.net/projects/npsml/



Answer 7:

Ç接口和实现讨论哈希表实现中C.的源代码是在线提供 。 (我的书的副本是在工作,所以我不能更具体。)



Answer 8:

Apache的APR库都有自己的哈希实施 。 它已经移植到任何运行Apache上的Apache许可证是相当宽松了。



Answer 9:

khash.h从samtools / BWA / seqtk / klib

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

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



Answer 10:

从来没有使用过,但谷歌Sparsehash可能工作



Answer 11:

下载TCL和使用他们的时间证明TCL散列函数。 这很简单。 而TCL API是有据可查的。



Answer 12:

的gperf - 完美的哈希函数信号发生器

http://www.ibm.com/developerworks/linux/library/l-gperf.html



Answer 13:

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)" */


Answer 14:

STL有地图和的hash_map(的hash_map只在一些实现),如果你能使用C ++的关键是价值。

http://www.cplusplus.com/reference/stl/map/



文章来源: Looking for a good hash table implementation in C [closed]