|
HashTable是Zend引擎中最重要、使用最廣泛的數(shù)據(jù)結(jié)構(gòu),它被用來存儲幾乎所有的東西。
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; // 整個HashTable的雙鏈表
struct bucket *pNext; // pNext和pLast用于組成某個hash對應(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初始化時指定,銷毀Bucket時調(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),一個鏈表散列和一個雙向鏈表,前者用于進(jìn)行快速鍵-值查詢,后者方便線性遍歷和排序,一個Bucket同時存在于這兩個數(shù)據(jù)結(jié)構(gòu)中。
關(guān)于該數(shù)據(jù)結(jié)構(gòu)的幾點(diǎn)解釋:
鏈表散列中為什么使用雙向鏈表?
一般的鏈表散列只需要按key進(jìn)行操作,只需要單鏈表就夠了。但是,Zend有時需要從鏈表散列中刪除給定的Bucket,使用雙鏈表可以非常高效的實現(xiàn)。
nTableMask是干什么的?
這個值用于hash值到arBuckets數(shù)組下標(biāo)的轉(zhuǎn)換。當(dāng)初始化一個HashTable,Zend首先為arBuckets數(shù)組分配nTableSize大小的內(nèi)存,nTableSize取不小于用戶指定大小的最小的2^n,即二進(jìn)制的10*。nTableMask = nTableSize
主站蜘蛛池模板:
使劲别停好大好深好爽动态图
|
一久久
|
超碰caopro熟女m超碰分类
|
暖暖视频免费观看高清完整版
|
久久受www免费人成_看片中文
|
丰满女友bd高清在线观看
|
伊人青青草原
|
91精品在线国产
|
欧美一区二区视频在线观看
|
日本一卡精品视频免费
|
丰满少妇69激情啪啪无码
|
国产乱国产乱老熟300部视频
|
日日夜夜影院在线播放
|
亚洲午夜精品A片久久WWW软件
|
国产GV无码A片在线观看
|
久久伊人久久
|
婚后被调教当众高潮H喷水
回复术士勇者免费观看全集
|
有码在线播放
|
中国老妇xxxhd
|
久久www免费人成_看片高清
|
诱咪youmiss|
偷窥国产亚洲免费视频
|
亚洲精品第一页中文字幕
|
国产精品免费一区二区三区视频
|
国产精品.XX视频.XXTV
|
一二三区乱码不卡手机版
|
一本色道久久88加勒比—综合
|
果冻传媒视频在线播放
|
国产精品久AAAAA片
|
国产亚洲视频在线播放香蕉
|
99九九精品视频
|
亚洲免费视频观看
|
乱叫抽搐流白浆免费视频
|
国产精品久久久久影院免费
|
免费看大黄高清网站视频在线
|
诱咪youmiss
|
国产精品成人A蜜柚在线观看
|
性色欲情网站IWWW
|
草神被爆漫画羞羞漫画
|
日日夜夜影院在线播放
|
2020美女视频黄频大全视频
|