HashTable在通常的資料結構教材中也稱作散列表,哈希表。其基本原理比較簡單(如果你對其不熟悉,請查閱隨便一本數據結構教材或在網上搜索),但PHP的實現有其獨特的地方。了解HashTable的資料儲存結構,對我們分析PHP的原始程式碼,特別是Zend Engine中的虛擬機器的實作時,有很重要的幫助。它可以幫助我們在大腦中模擬一個完整的虛擬機器的圖像。它也是PHP中其它一些資料結構如數組實現的基礎。
Zend HashTable的實作結合了雙向鍊錶和向量(陣列)兩種資料結構的優點,為PHP提供了非常高效的資料儲存和查詢機制。
Let's begin!
一、 HashTable的資料結構
在Zend Engine中的HashTable的實作程式碼主要包括zend_hash.h, zend_hash.c這兩個檔案中。 Zend HashTable包含兩個主要的資料結構,其一是Bucket(桶)結構,另一個是HashTable結構。 Bucket結構是用來保存資料的容器,而HashTable結構則提供了對所有這些Bucket(或桶列)進行管理的機制。
複製程式碼 程式碼如下:
typedef struct bucket {
ulong h; /* Used for numericindexing *
uint nKeyLength; /* key 長度*/
void *pData; /* 指向Bucket中儲存的資料的指標*/
void *pDataPtr; /* 指標資料*/
bstructucket * pListNext; /* 指向HashTable桶列中下一個元素*/
struct bucket *pListLast; /* 指向HashTable桶列中前一個元素*/
struct bucket *pNext; /* 指向具有同一個hash值的桶列的後一個元素*/
struct bucket *pLast; /* 指向具有同一個hash值的桶列的前一個元素*/
char arKey[1]; /* 必須是最後一個成員,key名稱*/
} Bucket;
複製程式碼 程式碼如下:
typedef struct _hashtable {
uint nTableSize;; >uint nNumOfElements;
ulong nNextFreeElement;
Bucket *pInternalPointer;
Bucket *pListHead;
Bucket *pListTail;
Bucket; ;
unsigned char nApplyCount;
zend_bool bApplyProtection;
#if ZEND_DEBUG
int inconsistent;
#endif
} HashTable
以上就介紹了hashtable PHP 原始碼分析 Zend HashTable詳解第1/3頁,包含了hashtable方面的內容,希望對PHP教學有興趣的朋友有幫助。