說 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。
Bucket 解析說明
先分析一下Bucket 結構體成員變量的作用:
說明
一. pData 和 pDataPtr 的關系,
- pData 指向的是保存數據的内存塊地址,一般通過malloc等分配;
- pDataPtr 如果是指針數據,此值會指向真正的value,同時pData 會指向該值
- 疑問 内存塊地址,不也是指針嗎?和pDataPtr什麼區别??
二. h 成員保存的是HashTable key 哈希後的值,而非HashTable中的索引值,為什麼?
- 索引值和HashTable的容量有關系,如果HashTable擴容,那麼這些索引還得重新進行哈希,再進行索引映射
- 數字索引直接就可以作為哈希表的索引,數字也無需進行哈希處理
- HashTable 解析說明
, 更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!