dict.h/dictht
结构定义:typedef struct dictht { // 哈希表数组 dictEntry **table; // 哈希表大小 unsigned long size; // 哈希表大小掩码,用于计算索引值 // 老是等于 size - 1 unsigned long sizemask; // 该哈希表已有节点的数量 unsigned long used; } dictht;
1.table属性是一个属组,数组中的每一个元素都是一个指向dict.h/dictEntry结构的指针,每一个
数组dictEntry结构保存着一个键值对;
2.size属性记录了哈希表的大小,也便是table数组的大小,而used属性则记录了哈希表目前已有节点(键值对)的数量;函数
3.sizemask属性的值老是等于size-1,这个属性和哈希值一块儿决定一个键应该被放到table数组的哪一个索引上面;ui
dictEntry
结构表示, 每一个 dictEntry
结构都保存着一个键值对:typedef struct dictEntry { // 键 void *key; // 值 union { void *val; uint64_t u64; int64_t s64; } v; // 指向下个哈希表节点,造成链表 struct dictEntry *next; } dictEntry;
1.key属性保存着键值对中的键,而v属性则保存着键值对中的值,其中v的值能够是一个指针,或者是一个uint64_t整数,或者是一个int64_t整数;spa
2.next属性是指向另外一个哈希表节点的指针,这个指针能够将多个哈希值相同的键值对链接在一块儿,以此来解决键冲突的问题;指针
举例说明,如何经过next指针,将两个索引值相同的键k1和k0链接在一块儿:code
dict.h/dict
结构表示:typedef struct dict { // 类型特定函数 dictType *type; // 私有数据 void *privdata; // 哈希表 dictht ht[2]; // rehash 索引 // 当 rehash 不在进行时,值为 -1 int rehashidx; /* rehashing not in progress if rehashidx == -1 */ } dict;
1.type
属性和 privdata
属性是针对不一样类型的键值对, 为建立多态字典而设置的;blog
2.ht
属性是一个包含两个项的数组, 数组中的每一个项都是一个 dictht
哈希表, 通常状况下, 字典只使用 ht[0]
哈希表, ht[1]
哈希表只会在对 ht[0]
哈希表进行 rehash 时使用;索引
3.除了 ht[1]
以外, 另外一个和 rehash 有关的属性就是 rehashidx
: 它记录了 rehash 目前的进度, 若是目前没有在进行 rehash , 那么它的值为 -1
。hash
4.举例说明一个普通状态下(没有进行rehash)的字典:it