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脚本数据库功能详解(上)
Oct 09 PHP
PHP动态生成javascript文件的2个例子
Apr 11 PHP
PHP不用递归遍历目录下所有文件的代码
Jul 04 PHP
destoon实现VIP排名一直在前面排序的方法
Aug 21 PHP
PHP函数实现分页含文本分页和数字分页
Oct 23 PHP
php过滤表单提交的html等危险代码
Nov 03 PHP
php插入排序法实现数组排序实例
Feb 16 PHP
php对二维数组进行相关操作(排序、转换、去空白等)
Nov 04 PHP
PHP Cookei记录用户历史浏览信息的代码
Feb 03 PHP
PHP实现类似于C语言的文件读取及解析功能
Sep 01 PHP
PHP实现的折半查询算法示例
Oct 09 PHP
php+laravel依赖注入知识点总结
Nov 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
解析PHP无限级分类方法及代码
2013/06/21 PHP
php foreach循环中使用引用的问题
2013/11/06 PHP
safari下载文件自动加了html后缀问题
2018/11/09 PHP
laravel 操作数据库常用函数的返回值方法
2019/10/11 PHP
为javascript添加String.Format方法
2020/08/11 Javascript
jQuery EasyUI API 中文文档 - Spinner微调器使用
2011/10/21 Javascript
JavaScript新窗口与子窗口传值详解
2014/02/11 Javascript
Jquery中基本选择器用法实例详解
2015/05/18 Javascript
javascript数组排序汇总
2015/07/07 Javascript
JS函数的几种定义方式分析
2015/12/17 Javascript
JS动态改变浏览器标题的方法
2016/04/06 Javascript
原生JS实现在线问卷调查投票特效
2017/01/03 Javascript
纯原生js实现贪吃蛇游戏
2020/04/16 Javascript
JS简单生成随机数(随机密码)的方法
2017/05/11 Javascript
浅析从vue源码看观察者模式
2018/01/29 Javascript
node 使用 async 控制并发的方法
2018/05/07 Javascript
electron制作仿制qq聊天界面的示例代码
2018/11/26 Javascript
初探Vue3.0 中的一大亮点Proxy的使用
2018/12/06 Javascript
extract-text-webpack-plugin用法详解
2019/02/14 Javascript
js常见遍历操作小结
2019/06/06 Javascript
jQuery设置下拉框显示与隐藏效果的方法分析
2019/09/15 jQuery
webpack proxy 使用(代理的使用)
2020/01/10 Javascript
vue中实现弹出层动画效果的示例代码
2020/09/25 Javascript
[01:29]2014DOTA2展望TI 剑指西雅图DK战队专访
2014/06/30 DOTA
[00:12]2018DOTA2亚洲邀请赛 sylar表现SOLO技艺
2018/04/06 DOTA
Keras中的多分类损失函数用法categorical_crossentropy
2020/06/11 Python
Python实现SMTP邮件发送
2020/06/16 Python
Python自动发送和收取邮件的方法
2020/08/12 Python
Python Pandas数据分析工具用法实例
2020/11/05 Python
秋天的图画教学反思
2014/05/01 职场文书
计算机网络及管理学专业求职信
2014/06/05 职场文书
安全环保演讲稿
2014/08/28 职场文书
房屋授权委托书范本
2014/10/07 职场文书
2015年六一儿童节活动总结
2015/02/11 职场文书
2015年安全生产月活动总结
2015/03/26 职场文书
python执行js代码的方法
2021/05/13 Python