当前位置:网站首页>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 .
边栏推荐
- VHDL implementation of arbitrary size matrix multiplication
- Machine learning notes - bird species classification using machine learning
- API data interface of A-share index component data
- Web service performance monitoring scheme
- Leetcode: interview question 17.24 Maximum cumulative sum of submatrix (to be studied)
- 2022中青杯C题城市交通思路分析
- tflite模型转换和量化
- map和set的实现
- UltraEdit-32 温馨提示:右协会,取消 bak文件[通俗易懂]
- 浅谈网络安全之文件上传
猜你喜欢
Kbone与小程序跨端开发的一些思考
[security attack and Defense] how much do you know about serialization and deserialization?
Que savez - vous de la sérialisation et de l'anti - séquence?
Mysql-数据丢失,分析binlog日志文件
Kotlin Android 环境搭建
【安全攻防】序列化与反序列,你了解多少?
Hisilicon 3559 universal platform construction: RTSP real-time playback support
Tflite model transformation and quantification
【开发软件】 tilipa开发者软件
你心目中的数据分析 Top 1 选 Pandas 还是选 SQL?
随机推荐
数据的存储
HW notes (II)
The JSON format of the international area code of the mobile phone number is obtained with PHP
1.19.11.SQL客户端、启动SQL客户端、执行SQL查询、环境配置文件、重启策略、自定义函数(User-defined Functions)、构造函数参数
机器学习笔记 - 使用机器学习进行鸟类物种分类
Free PHP online decryption tool source code v1.2
Clock in during winter vacation
What is the experience of maintaining Wanxing open source vector database
GPT-3当一作自己研究自己,已投稿,在线蹲一个同行评议
PHP lightweight Movie Video Search Player source code
One of oscp tools: dirsearch usage Encyclopedia
Mobile measurement and depth link platform - Branch
维护万星开源向量数据库是什么体验
C task expansion method
Some common software related
ggplot 分面的细节调整汇总
The most complete learning rate adjustment strategy in history LR_ scheduler
Native MySQL
三重半圆环进度条,直接拿去就能用
Create commonly used shortcut icons at the top of the ad interface (menu bar)