PHP的灵魂HashTable结构解读(php hash函数)

网友投稿 265 2022-06-17


说 HashTable 是PHP的灵魂,一点也不为过。在Zend引擎中,比如变量表、常量表、函数表、数组,以及资源管理、线程安全等,其实现都有HashTable的身影。HashTable 是一种查找性能极高的数据结构,理想情况下其算法复杂度是O(1)。

PHP 源码信息

PHP 版本:php-5.6.17

头文件: Zend/zend_hash.h,

源文件: Zend/zend_hash.c

注意:说明中使用了伪代码形式,只有代码块中的代码才可以执行

PHP HashTable 概述

有两部分组成,Bucket 和 HashTable,而且均为结构体(struct)。

Bucket 是存储数据的单元,用于保存具体的数据内容;HashTable 用于保存整个哈希表需要的基本信息。

二者关系可以简单理解为:HashTable = Array(); HashTable['arBuckets'] = [Bucket1, Bucket2, Bucket3, …]。

HashTable 的目的就是通过索引把每个Bucket元素分散到唯一的位置。

PHP 内核通过HashTable 结构管理Bucket 数组。

相比普通HashTable,PHP的HashTable同时维护一个双向链表。在HashTable.arBuckets 存储的是包含多个Bucket指针的向量,每个指针又指向一个双向链表(多个bucket组成)。

HashTable 源码展示

在Zend/zend_hash.h的line 55~83 中定义了结构体 Bucket 和 HashTable。注意 Bucket 和 HashTable 是别名,分别对应结构体 bucket 和 _hashtable。

typedef struct bucket {     ulong h;                        /* Used for numeric indexing */     uint nKeyLength;     void *pData;     void *pDataPtr;     struct bucket *pListNext;     struct bucket *pListLast;     struct bucket *pNext;     struct bucket *pLast;     const char *arKey; } Bucket; typedef struct _hashtable {     uint nTableSize;     uint nTableMask;     uint nNumOfElements;     ulong nNextFreeElement;     Bucket *pInternalPointer;   /* Used for element traversal */     Bucket *pListHead;     Bucket *pListTail;     Bucket **arBuckets;     dtor_func_t pDestructor;     zend_bool persistent;     unsigned char nApplyCount;     zend_bool bApplyProtection; #if ZEND_DEBUG     int inconsistent; #endif } HashTable;

Bucket 解析说明

先分析一下Bucket 结构体成员变量的作用:

说明

一. pData 和 pDataPtr 的关系,

pData 指向的是保存数据的内存块地址,一般通过malloc等分配;

pDataPtr 如果是指针数据,此值会指向真正的value,同时pData 会指向该值

疑问 内存块地址,不也是指针吗?和pDataPtr什么区别??

二. h 成员保存的是HashTable key 哈希后的值,而非HashTable中的索引值,为什么?

索引值和HashTable的容量有关系,如果HashTable扩容,那么这些索引还得重新进行哈希,再进行索引映射

数字索引直接就可以作为哈希表的索引,数字也无需进行哈希处理

HashTable 解析说明


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:项目上线后,谈一下感触比较深的一点:查询优化
下一篇:代付系统源码(支持API代付)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~