PHP的灵魂HashTable结构解读
2019-09-08 09:42:41来源:编程学习网 阅读 ()
说 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 解析说明
原文链接:http://www.phpxs.com/post/6533/
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- PHP访问MySQL查询超时怎么办 2020-03-09
- PHP简单实现单点登录功能示例 2019-10-09
- 关于php开启错误提示的总结 2019-10-09
- PHP进阶学习之垃圾回收机制详解 2019-10-09
- thinkphp5框架前后端分离项目实现分页功能的方法分析 2019-10-08
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash