标签:ash code 链表 red 哈希表 mamicode next 大小 bsp
一,哈希表节点
哈希表节点使用dictEntry结构表示,每个dictEntry结构都保存一个键值对。
typedef struct dictEntry{
//键
void *key;
//值
union{
void *val;
uint64_t u64;
int64_t s64;
} v;
//指向下一个哈希表节点,形成链表
struct dictEntry *next;
}
二,哈希表
Redis的字典所使用的哈希表由dictht结构定义:
typedef struct dictht{
//哈西表数组
dictEntry **tables;
//哈希表大小
unsigned long size;
//哈希表大小掩码,用来计算索引值,总是等于size-1
unsigned long sizemask;
//哈希表已经有的节点数量
unsigned long used;
}
table是一个数组,数组中的每个元素都是一个指向dictEntry结构的指针,每个dictEntry结构保存者一个键值对。
size记录了哈希表的大小,即table数组的大小
used记录了哈希表目前已经有的节点(键值对)的数量
sizemask和哈希值决定一个键应该被放到table数组的哪个索引上(索引值 = hash值 / sizemask)
三,字典
Redis字典使用的哈希表作为底层实现,一个哈希表里面可以有多个哈希表节点,每个哈希表节点保存一个键值对。
Redis中的字典由dict结构表示:
typedef struct dict{
//特定类型函数
dictType *type;
//私有数据
void *privdata;
//哈希表
dictht ht[2];
//rehash索引,当rehash不在进行时,值为-1
int trehashidx;
}
标签:ash code 链表 red 哈希表 mamicode next 大小 bsp
原文地址:https://www.cnblogs.com/inspred/p/10659243.html