天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

深入PHP中的HashTable結構詳解

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;

總的來說,Zend的HashTable是一種鏈表散列,同時也為線性遍歷進行了優化,圖示如下:


HashTable中包含兩種數據結構,一個鏈表散列和一個雙向鏈表,前者用于進行快速鍵-值查詢,后者方便線性遍歷和排序,一個Bucket同時存在于這兩個數據結構中。
關于該數據結構的幾點解釋:
鏈表散列中為什么使用雙向鏈表?
一般的鏈表散列只需要按key進行操作,只需要單鏈表就夠了。但是,Zend有時需要從鏈表散列中刪除給定的Bucket,使用雙鏈表可以非常高效的實現。
nTableMask是干什么的?
這個值用于hash值到arBuckets數組下標的轉換。當初始化一個HashTable,Zend首先為arBuckets數組分配nTableSize大小的內存,nTableSize取不小于用戶指定大小的最小的2^n,即二進制的10*。nTableMask = nTableSize

主站蜘蛛池模板: 成3d漫二区三区四区 | 国产AV天堂亚洲AV麻豆 | 97夜夜澡人人爽人人模人人喊 | 火影小南被爆羞羞网站 | 久久只有这里有精品4 | 狠狠人妻久久久久久综合九色 | 秋霞电影院兔费理论84MB | 伊人久久综合热青草 | 国产啪精品视频网免费 | 美女叉腿掰阴大胆艺术照 | 俄罗斯搜索引擎Yandex推广入口 | 超碰97人人做人人爱亚洲尤物 | 亚洲精品国产第一区第二区 | 国内精品免费久久影院 | 日本亚洲欧洲免费旡码 | 亚洲蜜桃AV永久无码精品放毛片 | 中文字幕AV在线一二三区 | 国产人妻人伦精品836700 | 久久亚洲精品无码A片大香大香 | 男女免费观看在线爽爽爽视频 | 久久精品视在线观看85 | 91在线一区二区 | 午夜在线观看免费完整直播网页 | 日韩一本道无码v | 亚洲日产2020乱码草莓毕 | 三级黃60分钟 | 日韩一级精品久久久久 | 国产精品亚洲AV色欲在线观看 | 欧美一区二区高清 | 午夜4k最新福利 | 野草观看免费高清视频 | 蜜臀AV久久国产午夜福利软件 | 色老99九久精品偷偷鲁 | 欧美做真爱欧免费看 | 四虎永久在线精品国产免费 | 久久久久嫩草影院精品 | 精品国产免费第一区二区 | 一本道综合久久免费 | 日本精品在线观看视频 | 日韩黄色免费 | 粉嫩无套白浆第一次jk |