background image

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 是一种链表散列,同时也为线性遍历进行了优化,图示如
下: