一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

深入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

主站蜘蛛池模板: 在线私拍国产福利精品 | 色综合久久中文色婷婷 | 黄色三级视频网站 | 欧美激情片网站 | 欧洲精品一区二区三区在线观看 | 色国产精品 | 国产婷婷一区二区三区 | 综合在线观看 | 一本色道久久鬼综合88 | 久久麻豆亚洲精品 | 黄色免费在线观看 | 久久狠狠一本精品综合网 | 国产激烈床戏无遮挡网站 | 成人在线观看免费视频 | 精品色综合 | 久久精品成人免费网站 | 视频三区| 久久久国产一区二区三区丝袜 | 在线观看免费污视频 | 2021最新久久久视精品爱 | 国产精品成人免费视频 | 小黄网站有哪些在线观看 | 天天色天天射天天干 | 国产真实伦实例 | 色噜噜狠狠狠综合曰曰曰88av | 色婷婷综合久久久中文字幕 | 美女胸又大又www又黄的网站 | 日本人视频18jizz免费 | 97高清国语自产拍中国大陆 | a级国产乱理论片在线观看 a级国产乱理论片在线观看看 | 美女一级毛片无遮挡内谢 | 国产图片综合 | 午夜欧美精品 | 色哟哟国产精品 | 丝袜精品 欧美 亚洲 自拍 | www.天天干.com| 四虎精品国产一区二区三区 | 色婷婷色丁香 | 国产亚洲综合精品一区二区三区 | 国产美女免费国产 | 天天操天天干天天插 |