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 源码展示

hashtablephpHashTable构造讲授据说是PHP的魂魄 AJAX

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

Bucket 解析解释

先剖析一下Bucket 构造体成员变量的浸染:

解释

一. pData 和 pDataPtr 的关系,

pData 指向的是保存数据的内存块地址,一样平常通过malloc平分派;pDataPtr 如果是指针数据,此值会指向真正的value,同时pData 会指向该值疑问 内存块地址,不也是指针吗?和pDataPtr什么差异??

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

索引值和HashTable的容量有关系,如果HashTable扩容,那么这些索引还得重新进行哈希,再进行索引映射数字索引直接就可以作为哈希表的索引,数字也无需进行哈希处理HashTable 解析解释