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中利用XML技术构造远程服务(上)
Oct 09 PHP
用函数读出数据表内容放入二维数组
Oct 09 PHP
PHP学习笔记之数组篇
Jun 28 PHP
php中使用redis队列操作实例代码
Feb 07 PHP
探讨PHP JSON中文乱码的解决方法详解
Jun 06 PHP
PHP5.5在windows安装使用memcached服务端的方法
Apr 16 PHP
PHP实现获取图片颜色值的方法
Jul 11 PHP
图文详解PHP环境搭建教程
Jul 16 PHP
Docker搭建自己的PHP开发环境
Feb 24 PHP
Laravel 实现数据软删除功能
Aug 21 PHP
tp5框架基于Ajax实现列表无刷新排序功能示例
Feb 10 PHP
有关PHP 中 config.m4 的探索
Aug 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
无线电广播的开始
2002/01/30 无线电
PHP默认安装产生系统漏洞
2006/10/09 PHP
php下检测字符串是否是utf8编码的代码
2008/06/28 PHP
解析php入库和出库
2013/06/25 PHP
PHP序列化/对象注入漏洞分析
2016/04/18 PHP
关于php支持的协议与封装协议总结(推荐)
2017/11/17 PHP
Laravel框架定时任务2种实现方式示例
2018/12/08 PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
2020/03/27 PHP
jquery模拟SELECT下拉框取值效果
2013/10/23 Javascript
检测一个函数是否是JavaScript原生函数的小技巧
2015/03/13 Javascript
js实现类似菜单风格的TAB选项卡效果代码
2015/08/28 Javascript
深入理解js generator数据类型
2016/08/16 Javascript
jquery-mobile基础属性与用法详解
2016/11/23 Javascript
微信通过页面(H5)直接打开本地app的解决方法
2017/09/09 Javascript
js 判断一个数字是不是2的n次方幂的实例
2017/11/26 Javascript
react router4+redux实现路由权限控制的方法
2018/05/03 Javascript
javascript数组去重方法总结(推荐)
2019/03/20 Javascript
Vue-cli3简单使用(图文步骤)
2019/04/30 Javascript
JS异步宏队列微队列原理详解
2020/09/09 Javascript
JavaScript 实现下雪特效的示例代码
2020/09/09 Javascript
vue中重定向redirect:‘/index‘,不显示问题、跳转出错的完美解决
2020/09/28 Javascript
django模板结构优化的方法
2019/02/28 Python
Python OpenCV实现视频分帧
2019/06/01 Python
Python3基础教程之递归函数简单示例
2019/06/07 Python
将自己的数据集制作成TFRecord格式教程
2020/02/17 Python
Python基于内置库pytesseract实现图片验证码识别功能
2020/02/24 Python
opencv 查找连通区域 最大面积实例
2020/06/04 Python
常用的10个Python实用小技巧
2020/08/10 Python
详解HTML5中垂直上下居中的解决方案
2017/12/20 HTML / CSS
写给女生的道歉信
2014/01/08 职场文书
客户答谢会活动方案
2014/08/31 职场文书
优秀党员自我评价范文
2014/09/15 职场文书
书法社团活动总结
2015/05/07 职场文书
MySQL如何快速创建800w条测试数据表
2022/03/17 MySQL
数据设计之权限的实现
2022/08/05 MySQL
MySQL实现用逗号进行拼接、以逗号进行分割
2022/12/24 MySQL