PHP中用hash实现的数组


Posted in PHP onJuly 17, 2011

PHP中使用最多的非Array莫属了,那Array是如何实现的?在PHP内部Array通过一个hashtable来实现,其中使用链接法解决hash冲突的问题,这样最坏情况下,查找Array元素的复杂度为O(N),最好则为1.
而其计算字符串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 相关文章推荐
用PHP实现登陆验证码(类似条行码状)
Oct 09 PHP
PHP脚本的10个技巧(8)
Oct 09 PHP
php巧获服务器端信息
Dec 06 PHP
PHP加速 eAccelerator配置和使用指南
Jun 05 PHP
php 广告调用类代码(支持Flash调用)
Aug 11 PHP
php sybase_fetch_array使用方法
Apr 15 PHP
教你如何快捷的使用cmd访问mysql小技巧
May 26 PHP
php通过隐藏表单控件获取到前两个页面的url
Sep 09 PHP
Laravel框架学习笔记(一)环境搭建
Oct 15 PHP
ThinkPHP实现支付宝接口功能实例
Dec 02 PHP
PHP里面把16进制的图片数据显示在html的img标签上(实现方法)
May 02 PHP
PHP jpgraph库的配置及生成统计图表:折线图、柱状图、饼状图
May 15 PHP
PHP中文分词的简单实现代码分享
Jul 17 #PHP
PHP 删除文件与文件夹操作 unlink()与rmdir()这两个函数的使用
Jul 17 #PHP
从手册去理解分析PHP session机制
Jul 17 #PHP
php数组的一些常见操作汇总
Jul 17 #PHP
PHP在特殊字符前加斜杠的实现代码
Jul 17 #PHP
PHP的explode和implode的使用说明
Jul 17 #PHP
PHP冒泡排序算法代码详细解读
Jul 17 #PHP
You might like
在IIS7.0下面配置PHP 5.3.2运行环境的方法
2010/04/13 PHP
php的memcache类分享(memcache队列)
2014/03/26 PHP
2014最热门的24个php类库汇总
2014/12/18 PHP
Yii2实现让关联字段支持搜索功能的方法
2016/08/10 PHP
JS中==与===操作符的比较
2009/03/21 Javascript
extjs 的权限问题 要求控制的对象是 菜单,按钮,URL
2010/03/09 Javascript
JS动态创建Table,Tr,Td并赋值的具体实现
2013/07/05 Javascript
JS获取url链接字符串 location.href
2013/12/23 Javascript
一个JavaScript获取元素当前高度的实例
2014/10/29 Javascript
nodejs简单实现中英文翻译
2015/05/04 NodeJs
jQuery插件expander实现图片翻转特效
2015/05/21 Javascript
原生javascript实现分享到朋友圈功能 支持ios和android
2016/05/11 Javascript
flag和jq on 的绑定多个对象和方法(必看)
2017/02/27 Javascript
Node.js和Express简单入门介绍
2017/03/24 Javascript
微信小程序 http请求的session管理
2017/06/07 Javascript
随机生成10个不重复的0-100的数字(实例讲解)
2017/08/16 Javascript
详解使用element-ui table组件的筛选功能的一个小坑
2018/11/02 Javascript
Vue自定义属性实例分析
2019/02/23 Javascript
uni-app使用微信小程序云函数的步骤示例
2020/05/22 Javascript
[32:39]完美世界DOTA2联赛循环赛 Forest vs Inki BO2第一场 11.04
2020/11/04 DOTA
使用wxpython实现的一个简单图片浏览器实例
2014/07/10 Python
python2和python3的输入和输出区别介绍
2018/11/20 Python
Python深拷贝与浅拷贝用法实例分析
2019/05/05 Python
Python爬虫实现使用beautifulSoup4爬取名言网功能案例
2019/09/15 Python
Python帮你识破双11的套路
2019/11/11 Python
Python接口自动化判断元素原理解析
2020/02/24 Python
详解Python 循环嵌套
2020/07/09 Python
什么是类的返射机制
2016/02/06 面试题
幼教求职信
2014/03/12 职场文书
中药专业自荐信范文
2014/03/18 职场文书
国际商务英语专业求职信
2014/07/08 职场文书
建设工程授权委托书
2014/09/22 职场文书
学校四风问题对照检查材料思想汇报
2014/09/26 职场文书
社会实践活动报告
2015/02/05 职场文书
初中生物教学随笔
2015/08/15 职场文书
关于对TypeScript泛型参数的默认值理解
2022/07/15 Javascript