我确实检查了以前关于此主题的问题,但找不到符合我需求的解决方案。
我需要什么:
支持字符串和整数元组(C中的int数组)。如果它是一个整数数组,则长度在编译时固定。
快速。
内存效率高。我将需要使用它来处理超大型数据集。
哈希表的容量将动态增长。我喜欢由库处理的哈希表大小的增长,而不是我。
我需要创建大量此类哈希表。并且这些哈希表将像树一样链接,因为一个哈希表中的值指向其他哈希表。
我的应用程序是内存和CPU绑定。 - 我是多么幸运啊! :)
我现在不考虑任何C ++实现,除非我在C中找不到任何解决方案。
谢谢!
答案 0 :(得分:13)
如何uthash - C结构的哈希表。
uthash对keys没有限制:键和结构可以任何数据类型 。
它包含散列common key types的默认宏,即整数和字符串。此外,它还提供了通用宏(HASH_ADD
和HASH_FIND
)来支持any data type。
听起来to be:
添加,查找和删除通常是常量操作。 [...]这个散列旨在简约而有效。它大约有900行C.
更多详情here:
在32位系统上,散列句柄每个项目消耗大约32个字节,或者在64位系统上每个项目消耗56个字节。其他管理费用 - 桶和表 - 相比之下可以忽略不计。
根据需要自动且无形地进行存储桶扩展。应用程序无需知道何时发生。
答案 1 :(得分:1)
Blender(3D图形应用程序)有自己的散列库,名为 BLI_ghash ,它有一些有用的功能。
虽然不是作为独立库编写的,但它并不难提取,但它可能有用作参考。 (注意其GPL2许可)。
其他补充:
从你的描述中可以做到的一点就是它可以做得很好 - 正在分配许多地图,因为每个地图都有自己的内存池,但没有很大的限制阻止你共享一个mempool,它只是没有开箱即用。
源代码: BLI_ghash.c,BLI_ghash.h BLI_mempool.c,BLI_mempool.h
注意,MEM_mallocN/MEM_freeN
函数可以替换为malloc/free