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&amp;mysql(四)
Oct 09 PHP
用ADODB来让PHP操作ACCESS数据库的方法
Dec 31 PHP
简单的PHP多图上传小程序代码
Jul 17 PHP
php中设置多级目录session的问题
Aug 08 PHP
探讨捕获php错误信息方法的详解
Jun 09 PHP
PHP集成百度Ueditor 1.4.3
Nov 23 PHP
smarty模板引擎中变量及变量修饰器用法实例
Jan 22 PHP
PHP实现无限分类的实现方法
Nov 14 PHP
利用PHP获取网站访客的所在地位置
Jan 18 PHP
详解PHP处理字符串类似indexof的方法函数
Jun 11 PHP
PHP Cli 模式设置进程名称的方法
Jun 12 PHP
Yii框架页面渲染操作实例详解
Jul 19 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
Zend framework处理一个http请求的流程分析
2010/02/08 PHP
11个PHP 分页脚本推荐
2011/08/15 PHP
PHP设计模式 注册表模式
2012/02/05 PHP
利用curl 多线程 模拟 并发的详解
2013/06/14 PHP
php实现网站顶踩功能的完整前端代码
2015/07/19 PHP
PHP进阶学习之类的自动加载机制原理分析
2019/06/18 PHP
Prototype使用指南之enumerable.js
2007/01/10 Javascript
一个刚完成的layout(拖动流畅,不受iframe影响)
2007/08/17 Javascript
Javascript 网页黑白效果实现代码(兼容IE/FF等)
2010/04/23 Javascript
用JS做的简单的可折叠的两级树形菜单
2013/09/21 Javascript
获取当前点击按钮的id用this.id实现
2014/03/17 Javascript
javascript解析json数据的3种方式
2014/05/08 Javascript
jQuery的animate函数学习记录
2014/08/08 Javascript
javascript实现禁止复制网页内容
2014/12/16 Javascript
javascript学习小结之prototype
2015/12/03 Javascript
jQuery技巧之让任何组件都支持类似DOM的事件管理
2016/04/05 Javascript
几种二级联动案例(jQuery\Array\Ajax php)
2016/08/13 Javascript
微信小程序 数据绑定详解及实例
2016/10/25 Javascript
基于JavaScript中字符串的match与replace方法(详解)
2017/12/04 Javascript
Layui Table js 模拟选中checkbox的例子
2019/09/03 Javascript
layui table 复选框跳页后再回来保持原来选中的状态示例
2019/10/26 Javascript
jQuery轮播图功能制作方法详解
2019/12/03 jQuery
vue学习笔记之过滤器的基本使用方法实例分析
2020/02/01 Javascript
[48:48]完美世界DOTA2联赛PWL S3 Magama vs GXR 第一场 12.19
2020/12/24 DOTA
Python中的匿名函数使用简介
2015/04/27 Python
python实现用户管理系统
2018/01/10 Python
基于python的itchat库实现微信聊天机器人(推荐)
2019/10/29 Python
Python3实现监控新型冠状病毒肺炎疫情的示例代码
2020/02/13 Python
全网首秀之Pycharm十大实用技巧(推荐)
2020/04/27 Python
利用css3径向渐变做一张优惠券的示例
2018/03/22 HTML / CSS
英国第一的滑雪服装和装备零售商:Snow+Rock
2020/02/01 全球购物
实体的生命周期
2013/08/31 面试题
传媒专业推荐信范文
2013/11/23 职场文书
信息技术课后反思
2014/04/27 职场文书
学习焦裕禄精神践行三严三实心得体会
2014/10/13 职场文书
mysql如何查询连续记录
2022/05/11 MySQL