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 array_merge下进行数组合并的代码
Jul 22 PHP
PHP生成带有雪花背景的验证码
Sep 28 PHP
php流量统计功能的实现代码
Sep 29 PHP
PHP插入排序实现代码
Apr 04 PHP
thinkphp实现面包屑导航(当前位置)例子分享
May 10 PHP
PHP中date与gmdate的区别及默认时区设置
May 12 PHP
Yii框架弹出框功能示例
Jan 07 PHP
Laravel框架中自定义模板指令总结
Dec 17 PHP
PHP实现打包zip并下载功能
Jun 12 PHP
PHP7.3.10编译安装教程
Oct 08 PHP
php获取是星期几的的一些常用姿势
Dec 15 PHP
yii框架结合charjs实现统计30天数据的方法
Apr 04 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
CodeIgniter图像处理类的深入解析
2013/06/17 PHP
下拉列表多级联动dropDownList示例代码
2013/06/27 PHP
PHP将两个关联数组合并函数提高函数效率
2014/03/18 PHP
PHP实例分享判断客户端是否使用代理服务器及其匿名级别
2014/06/04 PHP
PHP图片处理之图片旋转和图片翻转实例
2014/11/19 PHP
php封装的mysqli类完整实例
2016/10/18 PHP
微信公众平台开发(五) 天气预报功能开发
2016/12/03 PHP
php实现获取近几日、月时间示例
2019/07/06 PHP
破除一些网站复制、右键限制
2006/11/04 Javascript
JSDoc 介绍使用规范JsDoc的使用介绍
2011/02/12 Javascript
让人印象深刻的10个jQuery手风琴效果应用
2012/05/08 Javascript
jquery教程限制文本框只能输入数字和小数点示例分享
2014/01/13 Javascript
一个实用的图片切换支持点击切换和自动轮播
2014/09/09 Javascript
使用JavaScript实现点击循环切换图片效果
2017/09/03 Javascript
element-ui 关于获取select 的label值方法
2018/08/24 Javascript
Vue中使用create-keyframe-animation与动画钩子完成复杂动画
2019/04/09 Javascript
Vue项目打包压缩的实现(让页面更快响应)
2020/03/10 Javascript
用VsCode编辑TypeScript的实现方法
2020/05/07 Javascript
vue样式穿透 ::v-deep的具体使用
2020/06/04 Javascript
[01:02:17]2014 DOTA2华西杯精英邀请赛 5 24 DK VS VG
2014/05/26 DOTA
[56:56]VG vs LGD 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.22
2019/09/05 DOTA
举例详解Python中循环语句的嵌套使用
2015/05/14 Python
Centos7 Python3下安装scrapy的详细步骤
2018/03/15 Python
Python列表解析配合if else的方法
2018/06/23 Python
解决django后台样式丢失,css资源加载失败的问题
2019/06/11 Python
pandas中的series数据类型详解
2019/07/06 Python
Python实现简单的列表冒泡排序和反转列表操作示例
2019/07/10 Python
通过Python扫描代码关键字并进行预警的实现方法
2020/05/24 Python
python 瀑布线指标编写实例
2020/06/03 Python
解决Keras TensorFlow 混编中 trainable=False设置无效问题
2020/06/28 Python
使用Python绘制台风轨迹图的示例代码
2020/09/21 Python
一款利用css3的鼠标经过动画显示详情特效的实例教程
2014/12/29 HTML / CSS
亚马逊印度站:Amazon.in
2017/10/15 全球购物
初中学生操行评语
2014/12/26 职场文书
JS不要再到处使用绝对等于运算符了
2021/04/30 Javascript
MySQL系列之六 用户与授权
2021/07/02 MySQL