本质是链表
dict本身包含一个长度是2的链表数组
原因:
- 减少rehashing过程中阻塞操作的时常
- 可以方便的rehash,提高hash表效率
相关文件
- dict.h
- dict.c
相关概念
- hash函数算法
- 函数指针
数据结构
1 | typedef struct dictEntry { // 元素的实体类 |
主要宏
1 | /* This is the initial size of every hash table */ |
hash算法
1 | /* Thomas Wang's 32 bit Mix Function */ |
函数分析
dict *dictCreate(dictType *type, void *privDataPtr);
功能
创建空dict
源码
1 | /* Create a new hash table */ |
int dictExpand(dict *d, unsigned long size);
功能
变更dict的容量
size:可容纳键值对的数量
源码
1 | /* Expand or create the hash table */ |
int dictAdd(dict *d, void *key, void *val);
功能
向dict中添加键值对
源码
1 | /* Add an element to the target hash table */ |
dictEntry *dictAddRaw(dict *d, void *key);
功能
向dict中添加键
源码
1 | /* Low level add. This function adds the entry but instead of setting |
int dictReplace(dict *d, void *key, void *val);
功能
插入/更新键值对
返回是否是插入
0:更新
1:插入
源码
1 | /* Add an element, discarding the old if the key already exists. |
dictEntry *dictReplaceRaw(dict *d, void *key);
功能
从dict中获取到指定键的entry
可能是插入或更新
源码
1 | /* dictReplaceRaw() is simply a version of dictAddRaw() that always |
int dictDelete(dict *d, const void *key);
功能
删除指定键
释放键值对内存空间
源码
1 | int dictDelete(dict *ht, const void *key) { |
int dictDeleteNoFree(dict *d, const void *key);
功能
删除指定键
不释放键值对内存空间
源码
1 | int dictDeleteNoFree(dict *ht, const void *key) { |
void dictRelease(dict *d);
功能
释放整个dict的所有数据
源码
1 | /* Clear & Release the hash table */ |
dictEntry * dictFind(dict *d, const void *key);
功能
查找键
源码
1 | dictEntry *dictFind(dict *d, const void *key) |
void *dictFetchValue(dict *d, const void *key);
功能
根据键直接找到值指针
源码
1 | void *dictFetchValue(dict *d, const void *key) { |
int dictResize(dict *d);
功能
将dict占用内存缩小到最小的可用尺寸
源码
1 | /* This is the initial size of every hash table */ |
dictIterator *dictGetIterator(dict *d);
功能
生成一个指定dict的迭代器
默认非安全
源码
1 | dictIterator *dictGetIterator(dict *d) |
dictIterator *dictGetSafeIterator(dict *d);
功能
生成一个指定dict的迭代器
安全
源码
1 | dictIterator *dictGetSafeIterator(dict *d) { |
dictEntry *dictNext(dictIterator *iter);
功能
根据迭代器
获取下一个dict的元素
源码
1 | dictEntry *dictNext(dictIterator *iter) |
void dictReleaseIterator(dictIterator *iter);
功能
释放迭代器
源码
1 | void dictReleaseIterator(dictIterator *iter) |
dictEntry *dictGetRandomKey(dict *d);
功能
获取随机键
流程:
1. 随机获取两个ht的总index
2. 随机一个链表的索引
源码
1 | /* Return a random entry from the hash table. Useful to |
unsigned int dictGetSomeKeys(dict *d, dictEntry **des, unsigned int count);
功能
获取到count
个从一个随机键开始的连续元素
实际返回元素数<=count值
返回内容也不保证无重复
源码
1 | /* This function samples the dictionary to return a few keys from random |
static void _dictReset(dictht *ht);
功能
ht重置
源码
1 | /* Reset a hash table already initialized with ht_init(). |
int _dictInit(dict *d, dictType *type, void *privDataPtr);
功能
dict初始化
源码
1 | /* Initialize the hash table */ |
int dictRehash(dict *d, int n)
功能
dict的rehash
将数据从ht[0]迁移到ht[1]中
当全部迁移完毕后
释放旧数据
统一将ht[1]移动到ht[0]
分多次运行处理
以保证不会阻塞
源码
1 | /* Performs N steps of incremental rehashing. Returns 1 if there are still |
long long timeInMilliseconds(void);
功能
获取当前时间戳
毫秒
源码
1 | long long timeInMilliseconds(void) { |
int dictRehashMilliseconds(dict *d, int ms);
功能
在指定毫秒内持续rehash
源码
1 | /* Rehash for an amount of time between ms milliseconds and ms+1 milliseconds */ |
static void _dictRehashStep(dict *d);
功能
在没有安全迭代器的时候
rehash一个slot
通常在查找和更新dict时调用
目的是在使用dict的同时
自动rehash
源码
1 | /* This function performs just a step of rehashing, and only if there are |
static int dictGenericDelete(dict *d, const void *key, int nofree);
功能
通用删除操作
源码
1 | /* Search and remove an element */ |
int _dictClear(dict *d, dictht *ht, void(callback)(void *));
功能
清空指定的ht数据
源码
1 | /* Destroy an entire dictionary */ |
long long dictFingerprint(dict *d);
功能
计算dict的指纹数据
源码
1 | /* A fingerprint is a 64 bit number that represents the state of the dictionary |
static unsigned long rev(unsigned long v);
功能
反转操作位数据
源码
1 | /* Function to reverse bits. Algorithm from: |
unsigned long dictScan(dict *d, unsigned long v, dictScanFunction *fn, void *privdata);
功能
dict的scan迭代操作
防止命令阻塞
无状态,无额外内存占用的遍历
(没太明白,后面有时间仔细看看)
源码
1 | /* dictScan() is used to iterate over the elements of a dictionary. |