PHP的数组结构是用哈希表实现的
2014-11-10 21:06
218 查看
今天回顾学习了PHP中变量实现的方法,在浏览其源码是发现在PHP中所有的数据类型通过一个union存储。php语言是弱类型语言,其实现中通过记录变量的类型和值来实现其管理。
PHP中使用最多的非Array莫属了,那Array是如何实现的?在PHP内部Array通过一个hashtable来实现,其中使用链接法解决hash冲突的问题,这样最坏情况下,查找Array元素的复杂度为O(N),最好则为1.
而其计算字符串hash值的方法如下,将源码摘出来以供查备:
view
source
print?
ps:对于以下函数,仍有两点不明:
hash = 5381设置的理由?
这种step=8的循环方式是为了效率么?
PHP中使用最多的非Array莫属了,那Array是如何实现的?在PHP内部Array通过一个hashtable来实现,其中使用链接法解决hash冲突的问题,这样最坏情况下,查找Array元素的复杂度为O(N),最好则为1.
而其计算字符串hash值的方法如下,将源码摘出来以供查备:
view
source
print?
01 | static inline ulong zend_inline_hash_func( const char *arKey, uint nKeyLength) |
02 | { |
03 | register ulong hash = 5381; //此处初始值的设置有什么玄机么? |
04 | /* variant with the hash unrolled eight times */ |
05 | for (; nKeyLength >= 8; nKeyLength -= 8) { //这种step=8的方式是为何? |
06 | hash = ((hash << 5) + hash) + *arKey++; |
07 | hash = ((hash << 5) + hash) + *arKey++; |
08 | hash = ((hash << 5) + hash) + *arKey++; |
09 | hash = ((hash << 5) + hash) + *arKey++; //比直接*33要快 |
10 | hash = ((hash << 5) + hash) + *arKey++; |
11 | hash = ((hash << 5) + hash) + *arKey++; |
12 | hash = ((hash << 5) + hash) + *arKey++; |
13 | hash = ((hash << 5) + hash) + *arKey++; |
14 | } |
15 | switch (nKeyLength) { |
16 | case 7: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */ //此处是将剩余的字符hash |
17 | case 6: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */ |
18 | case 5: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */ |
19 | case 4: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */ |
20 | case 3: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */ |
21 | case 2: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */ |
22 | case 1: hash = ((hash << 5) + hash) + *arKey++; break ; |
23 | case 0: break ; |
24 | EMPTY_SWITCH_DEFAULT_CASE() |
25 | } |
26 | return hash; //返回hash值 |
27 | } |
hash = 5381设置的理由?
这种step=8的循环方式是为了效率么?
相关文章推荐
- [PHP] PHP数组的实现哈希表(HashTable)结构
- PHP的数组结构是用哈希表实现的
- 数据结构之数组实现哈希表应用总结篇
- php 实现遍历文件夹,返回树状结构数组
- php数组对百万数据进行排除重复数据的实现代码
- PHP利用b+树概念实现树形数组
- php 数组的创建、调用和更新实现代码
- PHP Array -- 使用数组实现矩阵的数学运算 -- PHP Matrix Math Functions
- PHP - Manual手册 - 语言参考 - 控制结构 - foreach遍历数组
- php实现树状结构无级分类
- PB动态数组实现机理1 --- 利用本身的结构来实现动态二维数组
- 深思 PHP 数组遍历的差异(array_diff 的实现)
- PHP 数组遍历 的差异(array_diff 的实现)
- 约瑟夫环问题的PHP实现 使用PHP数组内部指针操作函数
- 约瑟夫环问题的PHP实现 使用PHP数组内部指针操作函数
- PHP三层结构(下)——PHP实现AOP
- 【翻译】Programming Ruby——数组,哈希表和控制结构
- php实现数组转化成xml的类
- 数组的顺序结构表示和实现
- 妙用0元素数组 实现大小可变结构体