当前位置:网站首页>Redis source code learning (31), dictionary learning, dict.c (1)
Redis source code learning (31), dictionary learning, dict.c (1)
2022-07-07 04:02:00 【Traceless meaning】
1 dictCreate
1.1 Method statement
Create a new hash table
1.2 Method source code
/* Create a new hash table */
dict *dictCreate(dictType *type,
void *privDataPtr)
{
dict *d = zmalloc(sizeof(*d));// Allocate memory
_dictInit(d,type,privDataPtr);// Dictionary initialization
return d;
}
1.3 Related methods
1.3.1 _dictInit
/* Initialize the hash table */
int _dictInit(dict *d, dictType *type,
void *privDataPtr)
{
_dictReset(&d->ht[0]);
_dictReset(&d->ht[1]);
d->type = type;
d->privdata = privDataPtr;
d->rehashidx = -1;
d->iterators = 0;
return DICT_OK;
}
1.3.2 _dictReset
/* Reset a hash table already initialized with ht_init(). * NOTE: This function should only be called by ht_destroy(). */
static void _dictReset(dictht *ht)
{
ht->table = NULL;
ht->size = 0;
ht->sizemask = 0;
ht->used = 0;
}
1.4 Code understanding
- First declare a dictionary structure , And allocate the corresponding memory .
- call _dictInit Initialize Dictionary .
- call _dictReset Initialize two hash tables in the dictionary .
- Set several attribute fields in the hash table to initial values .
2 dictAdd
2.1 Method statement
Add a hash node to the hash table .
2.2 Method source code
/* Add an element to the target hash table */
int dictAdd(dict *d, void *key, void *val)
{
dictEntry *entry = dictAddRaw(d,key);
if (!entry) return DICT_ERR;
dictSetVal(d, entry, val);
return DICT_OK;
}
2.3 Related codes
2.3.1 dictAddRaw
/* Low level add. This function adds the entry but instead of setting * a value returns the dictEntry structure to the user, that will make * sure to fill the value field as he wishes. * * This function is also directly exposed to the user API to be called * mainly in order to store non-pointers inside the hash value, example: * * entry = dictAddRaw(dict,mykey); * if (entry != NULL) dictSetSignedIntegerVal(entry,1000); * * Return values: * * If key already exists NULL is returned. * If key was added, the hash entry is returned to be manipulated by the caller. */
dictEntry *dictAddRaw(dict *d, void *key)
{
int index;
dictEntry *entry;
dictht *ht;
// If the dictionary is in progress rahase in , Then proceed to step rahash
if (dictIsRehashing(d)) _dictRehashStep(d);
/* Get the index of the new element, or -1 if * the element already exists. */
// Get the built index
if ((index = _dictKeyIndex(d, key)) == -1)
return NULL;
/* Allocate the memory and store the new entry */
// If in rehash in Returns the second hash In the table
// Add the new hash node to the second hash In the table
ht = dictIsRehashing(d) ? &d->ht[1] : &d->ht[0];
entry = zmalloc(sizeof(*entry));
entry->next = ht->table[index];
ht->table[index] = entry;
ht->used++;
/* Set the hash entry fields. */
// Set hash build
dictSetKey(d, entry, key);
return entry;
}
2.3.2 _dictKeyIndex
/* Returns the index of a free slot that can be populated with * a hash entry for the given 'key'. * If the key already exists, -1 is returned. * * Note that if we are in the process of rehashing the hash table, the * index is always returned in the context of the second (new) hash table. */
static int _dictKeyIndex(dict *d, const void *key)
{
unsigned int h, idx, table;
dictEntry *he;
/* Expand the hash table if needed */
if (_dictExpandIfNeeded(d) == DICT_ERR)
return -1;
/* Compute the key hash value */
h = dictHashKey(d, key);
for (table = 0; table <= 1; table++) {
idx = h & d->ht[table].sizemask;
/* Search if this slot does not already contain the given key */
he = d->ht[table].table[idx];
while(he) {
if (dictCompareKeys(d, key, he->key))
return -1;
he = he->next;
}
if (!dictIsRehashing(d)) break;
}
return idx;
}
2.4 Code understanding
- call dictAddRaw Add a hash node
- Calculate the index value of the key , If the value already exists, an error is returned
- If it's going on rehash Words , Nodes will be added to the second hash table
- Call macro definition method dictSetKey Set the key of the hash node
- Call macro definition method dictSetVal Set the value of the hash node
3 Learning summary
- When adding a new hash node , If the node already exists, an error will be reported .
- call dictHashKey Calculate the hash value of the key .
- Then calculate the index position with hash value and dictionary mask .
- Traverse two hash tables , Determine whether the key already exists .
- If the dictionary is rehash In the words of , The new node will be added to the second hash table .
- If the dictionary is rehash In the words of , Will go one step rehash The action of .
边栏推荐
- Using thread class and runnable interface to realize the difference between multithreading
- C task expansion method
- QT 打开文件 使用 QFileDialog 获取文件名称、内容等
- 学习使用js把两个对象合并成一个对象的方法Object.assign()
- Tflite model transformation and quantification
- golang 压缩和解压zip文件
- opencv第三方库
- Summer 2022 daily question 1 (1)
- 运算放大器应用汇总1
- R data analysis: how to predict Cox model and reproduce high score articles
猜你喜欢

ABAP 动态内表分组循环
![[leetcode] 450 and 98 (deletion and verification of binary search tree)](/img/89/dd7ac0d886e6bbca5a439386c576bb.jpg)
[leetcode] 450 and 98 (deletion and verification of binary search tree)
10 ways of interface data security assurance

2022年电工杯B 题 5G 网络环境下应急物资配送问题思路分析
![[MySQL] row sorting in MySQL](/img/97/8a451fa62796838e11242c86eecd8d.png)
[MySQL] row sorting in MySQL

idea gradle lombok 报错集锦

海思万能平台搭建:颜色空间转换YUV2RGB

Kotlin Android 环境搭建

什么是 BA ?BA怎么样?BA和BI是什么关系?

QT opens a file and uses QFileDialog to obtain the file name, content, etc
随机推荐
golang 压缩和解压zip文件
easyui出口excel无法下载框弹出的办法来解决
Redis configuration and optimization of NoSQL
PHP 实现根据概率抽奖
Mysql-数据丢失,分析binlog日志文件
Collection of idea gradle Lombok errors
MySQL storage engine
How to detect whether the MySQL code runs deadlock +binlog view
杭州电 3711 Binary Number
QT item table new column name setting requirement exercise (find the number and maximum value of the array disappear)
【安全攻防】序列化与反序列,你了解多少?
Allow public connections to local Ruby on Rails Development Server
HW notes (II)
golang 根据生日计算星座和属相
Kotlin Android 环境搭建
Enter the rough outline of the URL question (continuously updated)
Kotlin Android environment construction
[hcie TAC] question 3
【编码字体系列】OpenDyslexic字体
. Net interface can be implemented by default