|
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
主站蜘蛛池模板:
亚州AV人片一区二区三区99久
|
97SE亚洲国产综合自在线不卡
|
久久精品午夜一区二区福利
|
狠狠色狠狠色综合日日92
|
免费看a毛片
|
国产ts调教
|
亚洲免费视频日本一区二区
|
亚洲人成网77777色在线播放
|
国产精品-区区久久久狼
|
97人人爽人人爽人人人片AV
|
亚洲国产欧美另类
|
日本性hd|
亚洲色婷婷久久精品AV蜜桃久久
|
野花视频在线观看免费最新动漫
|
国产AV国片精品无套内谢无码
|
亚洲中文字幕无码一久久区
|
俺也去最新地址
|
国产精品免费一区二区区
|
麻豆免费观看高清完整视频
|
国产综合18久久久久久软件
|
入禽太深免费观看
|
久久国产精品久久国产精品
|
久久黄色免费网站
|
世界上第一个得抑郁症的人是谁
|
97碰成视频免费
|
超碰人人草在线视频
|
欧美一级情欲片在线
|
男人把女人桶到爽免费看视频
|
欧美最猛性XXXXX肛交
|
窝窝影院午夜看片毛片
|
影音先锋av丝袜天堂
|
99爱在线观看精品视频
|
AV多人爱爱XXx
|
阿娇和冠希13分钟在线观看
|
草莓西瓜樱桃香蕉直播视频
|
久久re这里视频只精品首页
|
中文字幕按摩
|
亚洲国产五月综合网
|
久久九九少妇免费看A片
|
久久99国产精品一区二区
|
日日射日日操
|