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中cookies使用指南
Mar 16 PHP
在普通HTTP上安全地传输密码
Jul 21 PHP
php 分页函数multi() discuz
Jun 21 PHP
PHP+ajax 无刷新删除数据
Feb 20 PHP
PHP原理之异常机制深入分析
Aug 08 PHP
php随机输出名人名言的代码
Oct 07 PHP
qq登录,新浪微博登录接口申请过程中遇到的问题
Jul 22 PHP
codeigniter上传图片不能正确识别图片类型问题解决方法
Jul 25 PHP
thinkphp模板赋值与替换实例简述
Nov 24 PHP
Docker配置PHP开发环境教程
Dec 21 PHP
PHP读取XML格式文件的方法总结
Feb 27 PHP
Yii2.0 RESTful API 基础配置教程详解
Dec 26 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
通过ICQ网关发送手机短信的PHP源程序
2006/10/09 PHP
PHP 中执行排序与 MySQL 中排序
2009/04/21 PHP
php实现jQuery扩展函数
2009/10/30 PHP
PHP实现根据银行卡号判断银行
2015/04/29 PHP
Symfony模板的快捷变量用法实例
2016/03/17 PHP
PHP高效获取远程图片尺寸和大小的实现方法
2017/10/20 PHP
Extjs学习笔记之三 extjs form更多的表单项
2010/01/07 Javascript
jQuery学习2 选择器的使用说明
2010/02/07 Javascript
JavaScript中的Array对象使用说明
2011/01/17 Javascript
javascript中将Object转换为String函数代码 (json str)
2012/04/29 Javascript
JS写的贪吃蛇游戏(个人练习)
2013/07/08 Javascript
三种动态加载js的jquery实例代码另附去除js方法
2014/04/30 Javascript
在Ubuntu系统上安装Ghost博客平台的教程
2015/06/17 Javascript
四种参数传递的形式——URL,超链接,js,form表单
2015/07/24 Javascript
JS中cookie的使用及缺点讲解
2017/05/13 Javascript
JS中‘hello’与new String(‘hello’)引出的问题详解
2018/08/14 Javascript
Vue实现简单分页器
2018/12/29 Javascript
JavaScript ES6箭头函数使用指南
2018/12/30 Javascript
浅析 Vue 3.0 的组装式 API(一)
2020/08/31 Javascript
[53:38]OG vs LGD 2018国际邀请赛淘汰赛BO3 第三场 8.26
2018/08/30 DOTA
Python网络爬虫神器PyQuery的基本使用教程
2018/02/03 Python
python unittest实现api自动化测试
2018/04/04 Python
python+django+rest框架配置创建方法
2019/08/31 Python
Python下应用opencv 实现人脸检测功能
2019/10/24 Python
使用 Python 清理收藏夹里已失效的网站
2019/12/03 Python
html5+css3之制作header实例与更新
2020/12/21 HTML / CSS
挪威太阳镜和眼镜网上商城:SmartBuyGlasses挪威
2016/08/20 全球购物
美国最好的保健品打折网店:Swanson
2017/08/04 全球购物
英国网上超市:Ocado
2020/03/05 全球购物
Final类有什么特点
2012/04/25 面试题
军训生自我鉴定范文
2013/12/27 职场文书
应届毕业生通用的自荐书范文
2014/02/07 职场文书
学校运动会广播稿范文
2014/10/02 职场文书
党的群众路线批评与自我批评范文
2014/10/16 职场文书
2014年小学校长工作总结
2014/12/08 职场文书
美术教师个人工作总结
2015/02/06 职场文书