PHP 教学:PHP 中的 HashTable 结构
以下为大家详细介绍了 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;
int inconsistent;
#endif}
HashTable;
总的来说,Zend 的 HashTable 是一种链表散列,同时也为线性遍历进行了优化,图示如
下: