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 第三节 变量介绍
Apr 28 PHP
浅析PHP安装扩展mcrypt以及相关依赖项(PHP安装PECL扩展的方法)
Jul 05 PHP
请离开include_once和require_once
Jul 18 PHP
async和DOM Script文件加载比较
Jul 20 PHP
ThinkPHP分组下自定义标签库实例
Nov 01 PHP
Codeigniter发送邮件的方法
Mar 19 PHP
win10环境PHP 7 安装配置【教程】
May 09 PHP
基于PHP实现商品成交时发送短信功能
May 11 PHP
PHP面向对象程序设计之对象生成方法详解
Dec 02 PHP
PHP abstract 抽象类定义与用法示例
May 29 PHP
PHP实现单文件、多个单文件、多文件上传函数的封装示例
Sep 02 PHP
laravel 关联关系遍历数组的例子
Oct 10 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
历史证明,懒惰才是推动科学发展技术进步的动力
2021/03/02 无线电
PHP获取http请求的头信息实现步骤
2012/12/16 PHP
解析php中session的实现原理以及大网站应用应注意的问题
2013/06/17 PHP
php字符串按照单词进行反转的方法
2015/03/14 PHP
如何使用jQuery+PHP+MySQL来实现一个在线测试项目
2015/04/26 PHP
PHPUnit测试私有属性和方法功能示例
2018/06/12 PHP
laravel-admin的图片删除实例
2019/09/30 PHP
通过MSXML2自动获取QQ个人头像及在线情况(给初学者)
2007/01/22 Javascript
JavaScript 题型问答有答案参考
2010/02/17 Javascript
javascript中运用闭包和自执行函数解决大量的全局变量问题
2010/12/30 Javascript
javascript学习笔记(四)function函数部分
2014/09/30 Javascript
Jquery判断radio、selelct、checkbox是否选中及获取选中值方法总结
2015/04/15 Javascript
基于jQuery滑动杆实现购买日期选择效果
2015/09/15 Javascript
headjs实现网站并行加载但顺序执行JS
2016/11/29 Javascript
jQuery实现可兼容IE6的淡入淡出效果告警提示功能示例
2017/09/20 jQuery
Vue filter介绍及其使用详解
2017/10/21 Javascript
解决v-for中使用v-if或者v-bind:class失效的问题
2018/09/25 Javascript
Javascript读取上传文件内容/类型/字节数
2019/04/30 Javascript
JS阻止事件冒泡的方法详解
2019/08/26 Javascript
layui自己添加图片按钮并点击跳转页面的例子
2019/09/14 Javascript
Flask之flask-script模块使用
2018/07/26 Python
用Django写天气预报查询网站
2018/10/21 Python
使用python 打开文件并做匹配处理的实例
2019/01/02 Python
python f-string式格式化听语音流程讲解
2019/06/18 Python
Python实现图像去噪方式(中值去噪和均值去噪)
2019/12/18 Python
python pyecharts 实现一个文件绘制多张图
2020/05/13 Python
简单了解python关键字global nonlocal区别
2020/09/21 Python
CSS3 Pie工具推荐--让IE6-8支持一些优秀的CSS3特性
2014/09/02 HTML / CSS
俄罗斯第一家篮球店:StreetBall
2020/07/30 全球购物
现代化办公人员工作的自我评价
2013/10/16 职场文书
房屋出租协议书范本(标准版)
2014/09/24 职场文书
场地使用证明模板
2014/10/25 职场文书
团员个人总结
2015/02/26 职场文书
个性与发展自我评价
2015/03/06 职场文书
2016年党风廉政建设承诺书
2016/03/25 职场文书
CSS3实现的文字弹出特效
2021/04/16 HTML / CSS