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。
Bucket 解析解释
先剖析一下Bucket 构造体成员变量的浸染:
解释
一. pData 和 pDataPtr 的关系,
pData 指向的是保存数据的内存块地址,一样平常通过malloc平分派;pDataPtr 如果是指针数据,此值会指向真正的value,同时pData 会指向该值疑问 内存块地址,不也是指针吗?和pDataPtr什么差异??二. h 成员保存的是HashTable key 哈希后的值,而非HashTable中的索引值,为什么?
索引值和HashTable的容量有关系,如果HashTable扩容,那么这些索引还得重新进行哈希,再进行索引映射数字索引直接就可以作为哈希表的索引,数字也无需进行哈希处理HashTable 解析解释