PHP中用hash实现的数组
2011-07-17 00:00
246 查看
PHP中使用最多的非Array莫属了,那Array是如何实现的?在PHP内部Array通过一个hashtable来实现,其中使用链接法解决hash冲突的问题,这样最坏情况下,查找Array元素的复杂度为O(N),最好则为1.
而其计算字符串hash值的方法如下,将源码摘出来以供查备:
ps:对于以下函数,仍有两点不明:
hash = 5381设置的理由?
这种step=8的循环方式是为了效率么?
而其计算字符串hash值的方法如下,将源码摘出来以供查备:
static inline ulong zend_inline_hash_func(const char *arKey, uint nKeyLength) { register ulong hash = 5381; //此处初始值的设置有什么玄机么? /* variant with the hash unrolled eight times */ for (; nKeyLength >= 8; nKeyLength -= 8) { //这种step=8的方式是为何? hash = ((hash << 5) + hash) + *arKey++; hash = ((hash << 5) + hash) + *arKey++; hash = ((hash << 5) + hash) + *arKey++; hash = ((hash << 5) + hash) + *arKey++; //比直接*33要快 hash = ((hash << 5) + hash) + *arKey++; hash = ((hash << 5) + hash) + *arKey++; hash = ((hash << 5) + hash) + *arKey++; hash = ((hash << 5) + hash) + *arKey++; } switch (nKeyLength) { case 7: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */ //此处是将剩余的字符hash case 6: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */ case 5: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */ case 4: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */ case 3: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */ case 2: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */ case 1: hash = ((hash << 5) + hash) + *arKey++; break; case 0: break; EMPTY_SWITCH_DEFAULT_CASE() } return hash;//返回hash值 }
ps:对于以下函数,仍有两点不明:
hash = 5381设置的理由?
这种step=8的循环方式是为了效率么?
相关文章推荐
- PHP中用hash实现的数组
- PHP 数组和字符串互相转换实现方法
- PHP利用b+树概念实现树形数组
- PHP数组的Hash冲突实例
- PHP查找数组中只出现一次的数字实现方法【查找特定元素】
- PHP实现找出有序数组中绝对值最小的数算法分析
- php合并数组并保留键值的实现方法
- PHP的数组结构是用哈希表实现的
- php实现数组转化成xml的类
- 不使用php api函数实现数组的交换排序示例
- PHP 数组遍历 的差异(array_diff 的实现)
- php开发笔记(七)用数组函数实现生成随机字符串
- php 基础算法(用*表示金字塔)通过hash 比较两个数组相同的数
- 【面试题】有一个整数数组,求指定连续N个的和最大的子数组,PHP实现。
- PHP实现的自定义数组排序函数与排序类示例
- PHP实现对数组简单求交集,差集,并集功能示例
- php数组分页实现方法
- 取得某个数组前key大 PHP实现
- PHP 自定义方法实现数组合并