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 相关文章推荐
基于mysql的bbs设计(三)
Oct 09 PHP
php iconv() : Detected an illegal character in input string
Dec 05 PHP
一些PHP Coding Tips(php小技巧)[2011/04/02最后更新]
May 02 PHP
php empty() 检查一个变量是否为空
Nov 10 PHP
解析PHP中ob_start()函数的用法
Jun 24 PHP
ThinkPHP2.0读取MSSQL提示Incorrect syntax near the keyword 'AS'的解决方法
Jun 25 PHP
ThinkPHP实现将本地文件打包成zip下载
Jun 26 PHP
Yii核心组件AssetManager原理分析
Dec 02 PHP
php生成rss类用法实例
Apr 14 PHP
ajax调用返回php接口返回json数据的方法(必看篇)
May 05 PHP
php7安装yar扩展的方法详解
Aug 03 PHP
CI框架附属类用法分析
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
PHP在获取指定目录下的目录,在获取的目录下面再创建文件,多平台
2011/08/03 PHP
跟我学Laravel之快速入门
2014/10/15 PHP
PHP PDOStatement::errorCode讲解
2019/01/31 PHP
JavaScript中的排序算法代码
2011/02/22 Javascript
actionscript与javascript的区别
2011/05/25 Javascript
jquery移动listbox的值原理及代码
2013/05/03 Javascript
jquery 添加节点的几种方法介绍
2013/09/04 Javascript
客户端js判断文件类型和文件大小即限制上传大小
2013/11/20 Javascript
js实现同一页面可多次调用的图片幻灯切换效果
2015/02/28 Javascript
浏览器兼容的JS写法总结
2016/04/27 Javascript
非常漂亮的相册集 使用jquery制作相册集
2016/04/28 Javascript
浅谈JavaScript 执行环境、作用域及垃圾回收
2016/05/31 Javascript
jQuery简单验证上传文件大小及类型的方法
2016/06/02 Javascript
详解Node.js中的事件机制
2016/09/22 Javascript
微信小程序支付及退款流程详解
2017/11/30 Javascript
vue自定义移动端touch事件之点击、滑动、长按事件
2018/07/10 Javascript
videocapture库制作python视频高速传输程序
2013/12/23 Python
Django权限机制实现代码详解
2018/02/05 Python
transform python环境快速配置方法
2018/09/27 Python
不知道这5种下划线的含义,你就不算真的会Python!
2018/10/09 Python
python 执行文件时额外参数获取的实例
2018/12/18 Python
python机器人运动范围问题的解答
2019/04/29 Python
解决Python安装时报缺少DLL问题【两种解决方法】
2019/07/15 Python
python DataFrame转dict字典过程详解
2019/12/26 Python
python小技巧——将变量保存在本地及读取
2020/11/13 Python
Selenium 配置启动项参数的方法
2020/12/04 Python
浅析HTML5 meta viewport参数
2020/10/28 HTML / CSS
Kathmandu英国网站:新西兰户外运动品牌
2017/03/27 全球购物
全球独特生活方式产品和礼品购物网站:AHAlife
2018/09/18 全球购物
编写一个类体现构造,公有,私有方法,静态,私有变量
2013/08/10 面试题
数控技术专业推荐信
2013/11/01 职场文书
人力资源经理自我评价
2014/01/04 职场文书
《第一朵杏花》教学反思
2014/04/16 职场文书
计算机应用专业毕业生求职信
2014/06/03 职场文书
人大调研汇报材料
2014/08/14 职场文书
公司委托书范本5篇
2014/09/20 职场文书