数据结构
dictht
typedef struct dictht {// 哈希表数组dictEntry **table;// 哈希表大小unsigned long size;// 哈希表大小掩码,用于计算索引值// 总是等于 size - 1unsigned long sizemask;// 该哈希表已有节点的数量unsigned long used;} dictht;
+--------+|dictht ||--------| +-------------+|table |----->|dictEntry*[4]||--------| |-------------||size | | 0 |--> NULL|--------| |-------------||sizemask| | 1 |--> NULL|--------| |-------------||used | | 2 |--> NULL+--------+ |-------------|| 3 |--> NULL+-------------+
dictEntry
typedef struct dictEntry {// 键void *key;// 值union {void *val;uint64_t u64;int64_t s64;} v;// 指向下个哈希表节点,形成链表struct dictEntry *next;} dictEntry;
+--------+|dictht ||--------| +-------------+|table |----->|dictEntry*[4]||--------| |-------------||size | | 0 |--> NULL|--------| |-------------||sizemask| | 1 |--> NULL|--------| |-------------| +---------+ +---------+|used | | 2 |---------->|dictEntry|-->|dictEntry|--> NULL+--------+ |-------------| |---------| |---------|| 3 |--> NULL | k1 | v1 | | k1 | v1 |+-------------+ +---------+ +---------+
dict
typedef struct dict {// 类型特定函数dictType *type;// 私有数据void *privdata;// 哈希表dictht ht[2];// rehash 索引// 当 rehash 不在进行时,值为 -1int rehashidx; /* rehashing not in progress if rehashidx == -1 */} dict;
typedef struct dictType {// 计算哈希值的函数unsigned int (*hashFunction)(const void *key);// 复制键的函数void *(*keyDup)(void *privdata, const void *key);// 复制值的函数void *(*valDup)(void *privdata, const void *obj);// 对比键的函数int (*keyCompare)(void *privdata, const void *key1, const void *key2);// 销毁键的函数void (*keyDestructor)(void *privdata, void *key);// 销毁值的函数void (*valDestructor)(void *privdata, void *obj);} dictType;
+---------+|dict ||---------| +--------+|type | |dictht | +-------------+|---------| +---->|--------| |dictEntry*[4]||privdata | | |table |---->|-------------||---------| | |--------| | 0 ||ht |-----+ |size | |-------------| +---------+|---------| | |--------| | 1 |---->|dictEntry|----> NULL|rehashidx| | |sizemask| |-------------| |---------|+---------+ | |--------| | 2 | | k1 | v1 || |used | |-------------| +---------+| +--------+ | 3 || +-------------+| +--------++------>|dictht ||--------||table ||--------||size ||--------||sizemask||--------||used |+--------+
PS:和 java.util.HashMap 相似
