background image

HashTable 中包含两种数据结构,一个链表散列和一个双向链表,前者用于进行快速键-
值查询,后者方便线性遍历和排序,一个 Bucket 同时存在于这两个数据结构中。

关于该数据结构的几点解释:

链表散列中为什么使用双向链表?
一般的链表散列只需要按 key 进行操作,只需要单链表就够了。但是,Zend 有时需要从链
表散列中删除给定的 Bucket,使用双链表可以非常高效的实现。
nTableMask 是干什么的?
这个值用于 hash 值到 arBuckets 数组下标的转换。当初始化一个 HashTable,Zend 首先为
arBuckets 数组分配 nTableSize 大小的内存,nTableSize 取不小于用户指定大小的最小的
2^n,即二进制的 10*。nTableMask = nTableSize – 1,即二进制的 01*,此时 h & 
nTableMask

 

就恰好落在 [0, nTableSize – 1] 里,Zend 就以其为 index 来访问 arBuckets 数组。

pDataPtr 是干什么的?
通常情况下,当用户插入一个键值对时,Zend 会将 value 复制一份,并将 pData 指向
value 副本。复制操作需要调用 Zend

 

内部例程 emalloc 来分配内存,这是个非常耗时的操