(文中任何描述以及阐述不正确的地方希望大家不令赐教)
关于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也都使