tft每日頭條

 > 生活

 > php鍊式隊列結構

php鍊式隊列結構

生活 更新时间:2024-12-15 17:55:52

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

php鍊式隊列結構(HashTable結構講解據說是PHP的靈魂)1

Bucket 解析說明

先分析一下Bucket 結構體成員變量的作用:

php鍊式隊列結構(HashTable結構講解據說是PHP的靈魂)2

說明

一. pData 和 pDataPtr 的關系,

  • pData 指向的是保存數據的内存塊地址,一般通過malloc等分配;
  • pDataPtr 如果是指針數據,此值會指向真正的value,同時pData 會指向該值
  • 疑問 内存塊地址,不也是指針嗎?和pDataPtr什麼區别??

二. h 成員保存的是HashTable key 哈希後的值,而非HashTable中的索引值,為什麼?

  • 索引值和HashTable的容量有關系,如果HashTable擴容,那麼這些索引還得重新進行哈希,再進行索引映射
  • 數字索引直接就可以作為哈希表的索引,數字也無需進行哈希處理
  • HashTable 解析說明

php鍊式隊列結構(HashTable結構講解據說是PHP的靈魂)3

php鍊式隊列結構(HashTable結構講解據說是PHP的靈魂)4

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved