PHP HashTable总结
PHP 中数组使用起来非常的方便,可以使用字符串或者其他的复合类型作为数组的键。
我们知道数据都是存储在某个存储器地址上,在 C 语言中数组就只支持数字类型的下标来方便寻找元素。
使用了这么长时间的 PHP 语言,你是否对 PHP 数组的实现方式感兴趣呢?使用了什么数据结构?
介绍
PHP 数组的底层实现使用了 HashTable 这种数据结构。
HasahTable 又叫做散列表,具有如下特点
- 以 O(1) 的效率执行插入、删除和查找操作
- 元素是 K-V 形式存储,元素间是无顺序结构不能对数据进行排序
源码版本: php-7.1.19-src
解决哈希冲突一般有两种方式,PHP 使用的是分离链接法,既当产生冲突时,数据形成一个链表。
Hashtable 的数据结构
typedef struct _Bucket {
zval val; /* 存储的具体数据 */
zend_ulong h; /* hash 值 */
zend_string *key; /* 字符串键 | null(数字键时) */
} Bucket; typedef struct _zend_array HashTable; struct _zend_array {
zend_refcounted_h gc;
union {
struct {
ZEND_ENDIAN_LOHI_4(
zend_uchar flags,
zend_uchar nApplyCount,
zend_uchar nIteratorsCount,
zend_uchar consistency)
} v;
uint32_t flags;
} u;
uint32_t nTableMask; /* 掩码,用于根据hash值计算存储位置,永远等于nTableSize-1 */
Bucket *arData; /* 存放实际数据 */
uint32_t nNumUsed; /* arData数组已经使用的数量 */
uint32_t nNumOfElements; /* hash表中元素个数 */
uint32_t nTableSize; /* hash表的大小 */
uint32_t nInternalPointer; /* 用于HashTable遍历 */
zend_long nNextFreeElement; /* 下一个空闲可用位置的数字索引 */
dtor_func_t pDestructor; /* 析构函数 */
};
仔细观察上面的数据结构
- _zend_array 就是 PHP 数组的 HashTable 结构,存储了 HashTable 的一些大小、元素多少等必要信息
- 结构体 _Bucket (对应 _zend_array 中的 arData) 存储用户定义变量的数据,包括变量值和对应的键值
所以总结来说 PHP HashTable 的实现仍然使用的是数组这种数据结构(arData 是存储数据的数组),使用了一块连续的存储空间。如下图
PHP7 HashTable 的其他特点请阅读 Laruence 深入理解PHP7内核之HashTable
PHP HashTable总结的更多相关文章
- HashSet HashTable 与 TreeSet
HashSet<T>类 HashSet<T>类主要是设计用来做高性能集运算的,例如对两个集合求交集.并集.差集等.集合中包含一组不重复出现且无特性顺序的元素. HashSet& ...
- Javascript实现HashTable类
散列算法可以尽快在数据结构中找出指定的一个值,因为可以通过Hash算法求出值的所在位置,存储和插入的时候都按照Hash算法放到指定位置. <script> function HashTab ...
- Java集合专题总结(1):HashMap 和 HashTable 源码学习和面试总结
2017年的秋招彻底结束了,感觉Java上面的最常见的集合相关的问题就是hash--系列和一些常用并发集合和队列,堆等结合算法一起考察,不完全统计,本人经历:先后百度.唯品会.58同城.新浪微博.趣分 ...
- java面试题——HashMap和Hashtable 的区别
一.HashMap 和Hashtable 的区别 我们先看2个类的定义 public class Hashtable extends Dictionary implements Map, Clonea ...
- Map集合及与Collection的区别、HashMap和HashTable的区别、Collections、
特点:将键映射到值的对象,一个映射不能包含重复的键,每个键最多只能映射到一个值. Map集合和Collection集合的区别 Map集合:成对出现 (情侣) ...
- HashTable初次体验
用惯了数组.ArryList,初次接触到HashTable.Dictionary这种字典储存对于我来说简直就是高大上. 1.到底什么是HashTable HashTable就是哈希表,和数组一样,是一 ...
- HashMap和 Hashtable的比较
Hashtable 和 HashMap的比较 1. HashMap可以接受null(HashMap可以接受为null的键值(key)和值(value), HashTable不可以接受为null的键( ...
- hashMap和hashTable的区别
每日总结,每天进步一点点 hashMap和hashTable的区别 1.父类:hashMap=>AbstractMap hashTable=>Dictionary 2.性能:hashMap ...
- SortedList和HashTable
都是集合类,C#中同属命名空间System.Collections,“用于处理和表现类似keyvalue的键值对,其中key通常可用来快速查找,同时key是区分大小写:value用于存储对应于key的 ...
- Java Hashtable的实现
先附源码: package java.util; import java.io.*; /** * This class implements a hash table, which maps keys ...
随机推荐
- May 25th 2017 Week 21st Thursday
Follow your heart, but take your brain with you. 跟随你的内心,但是请别失去理智. I was ever told that we should fol ...
- (转)sizeof()和_countof()
(转)sizeof()和_countof() 先看程序: #include <iostream> using namespace std; int main(int argc, cha ...
- 发送请求获取响应内容(c#)
C#请求url,获取响应的脚本 public string ResultOfApi(string url) { //发送请求 HttpWebRequest request = null; HttpWe ...
- OC typedef(起别名)
// #define Integer int // 给基本数据类型起别名 void test() { typedef int Integer; typedef Integer MyInteger; t ...
- 二、 OSI模型的实现TCP 、IP
主要名词定义: IPIP层接收由更低层(网络接口层例如以太网设备驱动程序)发来的数据包,并把该数据包发送到更高层---TCP或UDP层:相反,IP层也把从TCP或UDP层接收来的数据包传送到更低层.I ...
- Error: Error SSL Required Code: 403
Error: Error SSL Required Code: 403 Error Message If the 'services' Web directory for ArcGIS is set ...
- Android(java)学习笔记45:深入分析Java ClassLoader原理
1. 前言: Android中的动态加载机制能更好的优化我们的应用,同时实现动态的更新,这就便于我们管理我们的应用,通过插件化来减轻我们的内存以及CPU消耗,在不发布新版本的情况下能更新某些模块. 当 ...
- miniMobile(手机)
官网:http://www.web2014.cn/
- php如何实现登陆后返回原页面
访问网站页面时,有的页面需要授权才能访问,这时候就会要求用户登录,跳转到登录页面login.php,怎么实现登录后返回到刚才访问的页面项目需求 访问网站页面时,有的页面需要授权才能访问,这时候就会要求 ...
- Spring8中lambda表达式的学习(Function接口、BiFunction接口、Consumer接口)
代码重构,为了确保功能的等效性,梳理代码时,发现如下代码: public SingleRespTTO fundI(SingleReqTTO request) throws Exception { re ...