|
HashTable是Zend引擎中最重要、使用最廣泛的數(shù)據(jù)結(jié)構(gòu),它被用來存儲(chǔ)幾乎所有的東西。
1.2.1 數(shù)據(jù)結(jié)構(gòu)
HashTable數(shù)據(jù)結(jié)構(gòu)定義如下:
復(fù)制代碼 代碼如下:
typedef struct bucket {
ulong h; // 存放hash
uint nKeyLength;
void *pData; // 指向value,是用戶數(shù)據(jù)的副本
void *pDataPtr;
struct bucket *pListNext; // pListNext和pListLast組成
struct bucket *pListLast; // 整個(gè)HashTable的雙鏈表
struct bucket *pNext; // pNext和pLast用于組成某個(gè)hash對(duì)應(yīng)
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數(shù)組
dtor_func_t pDestructor; // HashTable初始化時(shí)指定,銷毀Bucket時(shí)調(diào)用
zend_bool persistent; // 是否采用C的內(nèi)存分配例程
unsigned char nApplyCount;
zend_bool bApplyProtection;
#if ZEND_DEBUG
int inconsistent;
#endif
} HashTable;
HashTable中包含兩種數(shù)據(jù)結(jié)構(gòu),一個(gè)鏈表散列和一個(gè)雙向鏈表,前者用于進(jìn)行快速鍵-值查詢,后者方便線性遍歷和排序,一個(gè)Bucket同時(shí)存在于這兩個(gè)數(shù)據(jù)結(jié)構(gòu)中。
關(guān)于該數(shù)據(jù)結(jié)構(gòu)的幾點(diǎn)解釋:
鏈表散列中為什么使用雙向鏈表?
一般的鏈表散列只需要按key進(jìn)行操作,只需要單鏈表就夠了。但是,Zend有時(shí)需要從鏈表散列中刪除給定的Bucket,使用雙鏈表可以非常高效的實(shí)現(xiàn)。
nTableMask是干什么的?
這個(gè)值用于hash值到arBuckets數(shù)組下標(biāo)的轉(zhuǎn)換。當(dāng)初始化一個(gè)HashTable,Zend首先為arBuckets數(shù)組分配nTableSize大小的內(nèi)存,nTableSize取不小于用戶指定大小的最小的2^n,即二進(jìn)制的10*。nTableMask = nTableSize
主站蜘蛛池模板:
精品无码三级在线观看视频
|
福利免费观看体检区
|
亚洲日韩有码无线免费
|
一级毛片西西人体44rt高清
|
亚洲国产日韩欧美视频二区
|
久久看片网
|
久在线观看福利视频
|
色女仆影院
|
色婷婷综合久久久久中文一区二区
|
日日射夜夜干夜夜插在线播放
|
伊人大香线蕉影院在线播放
|
国产一区二区在线免费观看
|
免费黄色网址在线观看
|
护士被老头边摸边吃奶的视频
|
亚洲不卡高清免v无码屋
|
久久亚洲精品专区蓝色区
|
日本真人啪啪试看30秒
|
韩国和日本免费不卡在线
|
欧美囗交xx bbb视频
|
成人久久欧美日韩一区二区三区
|
国产九九九九九九九A片
|
操他射他影院
|
日日噜噜夜夜狠狠视频
|
国产野外无码理论片在线观看
|
果冻传媒 在线播放观看
|
99在线观看免费视频
|
久久vs国产综合色
|
99视频在线观看免费视频
|
欧美xxx性|
色人格影院第四色
|
热思思
|
jk制服啪啪网站
|
蜜桃色欲AV久久无码精品
|
99国产热视频在线观看
|
男欢女爱免费视频
|
青青草A在在观免费线观看
青青草AV国产精品
青青草 久久久
|
亚洲va精品中文字幕
|
姉调无修版ova国语版
|
国产1000部成人免费视频
|
亚洲黄色录像片
|
80岁色老头69av
|