1.1 雜湊表資料結構
typedef
struct dictht dictht;
1.2 字典資料結構typedef
struct dict dict;
2.1 擴縮容條件
2.2 擴容流程
2.3 漸進式rehash
2.4 漸進式rehash場景3.1 迭代器資料結構
迭代器主要用於遍歷字典,遍歷資料的原則為:不重複出現資料、不遺漏任何資料
typedef
struct dictiterator dictiterator;
3.2 普通迭代器
3.3 安全迭代器
static
void
_dictrehashstep
(dict *d)
4.1 索引更新方式
通常情況下,遍歷情況下的索引更新方式為從0遞增到size-1,可以保證所有資料不會遺漏。但在discan遍歷方式中,索引更新方式採用了另外一種策略,從高位開始遞增。**如下,如長度為8的情況,索引順序為000-100-010-110-001-101-011-111
。
v |
=~m1;
//m1為雜湊表掩碼
v =rev(v)
;//二進位制逆轉
v++; v =
rev(v)
;//二進位制逆轉
static
unsigned
long
rev(
unsigned
long v)
return v;
}
4.2 遍歷方式
針對遍歷,我們要考慮三種情況,未進行擴縮容,迭代中正在進行rehash,迭代過程中已完成擴縮容。
未進行擴縮容,則只需按照當前索引更新方式遍歷雜湊表ht[0]即可。
迭代過程中已完成擴縮容,即仍只需要遍歷雜湊表ht[0]即可。實例如:假設hash表大小為4,進行第3次迭代時,hash表擴容到了8。此時我們發現,迭代只進行6次就完成了,順序為0、2、1、5、3、7,擴容後少遍歷了4、6,因為游標為0、2的資料在擴容前已經迭代完,而hash表大小從4擴容至8,再經過rehash後,游標為0、2的資料可能會分布在0|4、2|6上,因此擴容後的游標4、6不需要再迭代。
迭代過程中正在rehash,則需要遍歷雜湊表ht[0]和ht[1],假設size更小的為t[0],大的為t[1],則根據當前的索引值,遍歷t[0]上的資料,還需要遍歷t[1]該索引值高位為1的資料。t[1]遍歷的 條件為while(v & (m0 ^ m1))
。實例如:ht[0]大小為8,ht[1]大小為32,當前索引為011,則在ht[1]需要遍歷的位置順序為00
011、10
011、01
011、11
011。高位逐漸+1的過程。
Redis資料結構 字典
1,字典,又稱為符號表 關聯陣列 或對映,是一種用於儲存鍵值對的抽象資料結構。2,redis的字典使用雜湊表作為底層實現,雜湊表的結構定義如下 typedef struct dicthtdicket table屬性是乙個陣列,陣列中的每個元素都是乙個指向dict.h dictentry結構的指標,每...
Redis資料結構 字典
字典在redis中應用廣泛,redis資料庫的底層就是使用字典來實現的,對資料庫的增刪查改也都是建立在字典的操作之上的。此外,字典還是雜湊鍵的實現之一。雜湊表由dict.h dictht結構定義 typedef struct dictht dictht 雜湊表節點使用dictentry結構表示,每個...
redis資料結構之字典
字典 dictionary 其實和符號表 symbol table 關聯陣列 associative array 對映 map 是乙個東東,都是為了儲存鍵值對 k v pair 的資料結構,屌屌噠。php中因為能很方便的用關聯陣列,因此能寫出很多實用高效的 有空一定要去好好了解下php的關聯陣列是如...