|
HashTable是Zend引擎中最重要、使用最廣泛的數據結構,它被用來存儲幾乎所有的東西。
1.2.1 數據結構
HashTable數據結構定義如下:
復制代碼 代碼如下:
typedef struct bucket {
ulong h; // 存放hash
uint nKeyLength;
void *pData; // 指向value,是用戶數據的副本
void *pDataPtr;
struct bucket *pListNext; // pListNext和pListLast組成
struct bucket *pListLast; // 整個HashTable的雙鏈表
struct bucket *pNext; // pNext和pLast用于組成某個hash對應
struct bucket *pLast; // 的雙鏈表
char arKey[1]; // key
} Bucket;
typedef struct _hashtable {
uint nTableSize;
uint nTableMask;
uint nNumOfElements;
ulong nNextFreeElement;
Bucket *pInternalPointer; /* Used for element traversal */
Bucket *pListHead;
Bucket *pListTail;
Bucket **arBuckets; // hash數組
dtor_func_t pDestructor; // HashTable初始化時指定,銷毀Bucket時調用
zend_bool persistent; // 是否采用C的內存分配例程
unsigned char nApplyCount;
zend_bool bApplyProtection;
#if ZEND_DEBUG
int inconsistent;
#endif
} HashTable;
HashTable中包含兩種數據結構,一個鏈表散列和一個雙向鏈表,前者用于進行快速鍵-值查詢,后者方便線性遍歷和排序,一個Bucket同時存在于這兩個數據結構中。
關于該數據結構的幾點解釋:
鏈表散列中為什么使用雙向鏈表?
一般的鏈表散列只需要按key進行操作,只需要單鏈表就夠了。但是,Zend有時需要從鏈表散列中刪除給定的Bucket,使用雙鏈表可以非常高效的實現。
nTableMask是干什么的?
這個值用于hash值到arBuckets數組下標的轉換。當初始化一個HashTable,Zend首先為arBuckets數組分配nTableSize大小的內存,nTableSize取不小于用戶指定大小的最小的2^n,即二進制的10*。nTableMask = nTableSize
主站蜘蛛池模板:
济公斗蟋蟀|
德兰|
美女网站视频免费|
八年级上册三峡|
死神降临|
成家立业演员表|
果戈里起点女的被劫走是多少分钟|
欧若拉歌词|
冷血惊魂|
爱情手册电影|
大众故事1974意大利|
3844开关电源电路图|
少爷和我短剧|
小学生必用头像|
无耻之徒豆瓣|
绝对权力全集免费观看|
韩国女车模|
国内自拍99|
相识韩国|
歌曲串烧串词|
柴碧云|
欧美一级毛片无遮挡|
男生变女生tg动画变身|
铁血战士电影|
2025小升初真题卷英语|
电影处女地|
爱欲1990未删减版播放|
伦理 在线|
西野翔三级全部电影|
陈宝莲徐锦江夜半2普通话|
浪荡子的旅程电影|
24点数学题目100道|
原来这就是爱啊 电视剧|
爱在记忆中找你歌词|
卢靖姗的个人资料简介|
call me by your name电影|
小敏家|
日本无翼乌邪恶大全彩h下拉式|
rima horton|
饥渴的少妇电影完整版|
色戒在线视频观看|