PHP内核每天挖一点-数组的底层结构

文中任何描述以及阐述不正确的地方希望大家不令赐教

关于PHP中的数组确实是太灵活了,那么数组究竟在底层的结构是怎样的?这个是比较让人好奇的。在PHP中数组的实现是通过哈希表实现的,这个在动态语言的实现中比较常见。下面主要讲解一下PHP中的哈希表结构:



上图基本反应了hashtable的一个基本结构示例。

我们知道在C语言里数组是一个基本的内存块(chunk of memory),所以使用一定要明确数组长度而动态数组几乎是不可能的,同理associative array这种形式的也是不存在的,但在PHP里面数组是一个很灵活的数据结构,当然不仅仅PHP在现代动态语言的实现中几乎都存在这种动态灵活的数据结构,比如JS, python等等,那么他们是如何实现的,这就要用到一个结构哈希表。很多动态语言的核心其实就是一张哈希表。PHP的哈希表实现有点复杂,本文就深入阐释PHP哈希表的实现。

什么叫哈希表?

散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。--维基百科

从定义看哈希表最关键的两个方面

1. 通过一关键码访问(关键码的确定,哈希函数)

2. 映射到数据结构中(哈希表本身的存储结构)

3. 映射的处理(冲突或者碰撞检测和处理函数)

 

对于PHP的哈希我们也从上面三个方面进行分析。一般来说对于整形索引进行哈希我们很容易想到的是取模运算,比如array(1=>'a', 2=>'b', 3=>'c'),这类我们可以使用index%3来哈希,不过PHP数组的下标还有更灵活的array('a'='c', 'b'=>'d'), 此时选择什么哈希函数?答案是DJBX33A算法(DJBX33A算法,也就是time33算法,是APR默认哈希算法,php, apache, perl, bsddb也都使

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值