前言
在cpp/util中实现了基于内存的哈希表(hashmap.(cpp,h))。该哈希表支持dump到文件,以及从文件load到内存。在实现上,它基于传统的开链哈希,分别为每个哈希桶维护一个block链表,相同哈希值的kv对散列存储到相同的block链表中。链表中每个block存储具体的一个kv数据。由于hashmap使用TC_MemMultiChunkAllocator进行内存管理,因此它以块为单位使用内存(当然,支持不同大小的块)。hashmap通过在block中维护chunk链表来支持数据操作(主要是set)的灵活性。为了更好和磁盘读写对接(dump,load),hashmap使用的所有内存都属于一块连续的内存空间。除此之外,为了对外提供灵活的会写,备份功能,hashmap还对block建立了多维的管理链表(_iSet,_iGet,….)。
内存结构
如上图为hashmap实现的逻辑视图。一个简单的开链哈希算法,并通过tagMapHead对哈希中的block提供多种类型的管理功能。kv值编码成一个二进制序列存储在block-chunk链表中(chunk非必须),kv的编解码使用TC_PackOut/TC_PackIn来完成(tc_Pack.cpp)。当然,hashmap支持只有key的存储,类似STL中的set集合。
为了方便地支持将哈希表dump到文件或者从文件load进入内存,hashmap的实现内存是在一整块连续的内存空间中。如下图所示: <