php 结构体_HashTable结构讲解,据说是PHP的灵魂

说 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。

96159171656b57ba42e10b6b9b87024d.png

Bucket 解析说明

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

9a891310a17049397c7f3e7b4033c410.png

说明

一. pData 和 pDataPtr 的关系,

  • pData 指向的是保存数据的内存块地址,一般通过malloc等分配;
  • pDataPtr 如果是指针数据,此值会指向真正的value,同时pData 会指向该值
  • 疑问 内存块地址,不也是指针吗?和pDataPtr什么区别??

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

  • 索引值和HashTable的容量有关系,如果HashTable扩容,那么这些索引还得重新进行哈希,再进行索引映射
  • 数字索引直接就可以作为哈希表的索引,数字也无需进行哈希处理
  • HashTable 解析说明
94873148b12ee9417f1bb1833e7c9ce0.png
95aef8526fa74545e9e0fdb3b34230ac.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值