寻找哈希表C库

时间:2013-08-12 22:39:24

标签: c hashtable

我确实检查了以前关于此主题的问题,但找不到符合我需求的解决方案。

我需要什么:

  1. 支持字符串和整数元组(C中的int数组)。如果它是一个整数数组,则长度在编译时固定。

  2. 快速。

  3. 内存效率高。我将需要使用它来处理超大型数据集。

  4. 哈希表的容量将动态增长。我喜欢由库处理的哈希表大小的增长,而不是我。

  5. 我需要创建大量此类哈希表。并且这些哈希表将像树一样链接,因为一个哈希表中的值指向其他哈希表。

  6. 我的应用程序是内存和CPU绑定。 - 我是多么幸运啊! :)

    我现在不考虑任何C ++实现,除非我在C中找不到任何解决方案。

    谢谢!

2 个答案:

答案 0 :(得分:13)

如何uthash - C结构的哈希表

  • 支持字符串和整数元组

uthash对keys没有限制:键和结构可以任何数据类型

它包含散列common key types的默认宏,即整数和字符串。此外,它还提供了通用宏(HASH_ADDHASH_FIND)来支持any data type

  • 快速

听起来to be

  

添加,查找和删除通常是常量操作。 [...]这个散列旨在简约而有效。它大约有900行C.

  • 内存效率

更多详情here

  

在32位系统上,散列句柄每个项目消耗大约32个字节,或者在64位系统上每个项目消耗56个字节。其他管理费用 - 桶和表 - 相比之下可以忽略不计。

  • 哈希表的容量将动态增长

支持out-of-the-box

  

根据需要自动且无形地进行存储桶扩展。应用程序无需知道何时发生。

答案 1 :(得分:1)

Blender(3D图形应用程序)有自己的散列库,名为 BLI_ghash ,它有一些有用的功能。

虽然不是作为独立库编写的,但它并不难提取,但它可能有用作参考。 (注意其GPL2许可)

  • 使用内存池作为元素。
  • 根据需要(自动)扩展存储桶。
  • 每个元素需要3个指针(每个元素12或24个字节)。
  • 用于散列字符串,指针,整数的实用程序函数,或者可以选择性地进行比较&哈希回调。
  • 公开迭代器(遍历ghash中的所有项目)。
  • 还会根据 BLI_ghash 公开 BLI_gset API,但会保存存储值指针。

其他补充:

  • 可以保留一个尺寸,以避免在提前知道尺寸时调整存储桶大小。
  • 可以计算散列函数的质量(用于测试桶的均匀分布情况)。

从你的描述中可以做到的一点就是它可以做得很好 - 正在分配许多地图,因为每个地图都有自己的内存池,但没有很大的限制阻止你共享一个mempool,它只是没有开箱即用。

源代码: BLI_ghash.cBLI_ghash.h BLI_mempool.cBLI_mempool.h


注意,MEM_mallocN/MEM_freeN函数可以替换为malloc/free