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 相关文章推荐
使用数据库保存session的方法
Oct 09 PHP
php中文字符截取防乱码
Mar 28 PHP
PHP数组循环操作详细介绍 附实例代码
Feb 03 PHP
php 创建以UNIX时间戳命名的文件夹(示例代码)
Mar 08 PHP
PHP异常Parse error: syntax error, unexpected T_VAR错误解决方法
May 06 PHP
php数组保存文本与文本反编成数组实例
Nov 13 PHP
使用php的HTTP请求的库Requests实现美女图片墙
Feb 22 PHP
PHP+MySQL实现无极限分类栏目的方法
Dec 23 PHP
Docker 如何布置PHP开发环境
Jun 21 PHP
PHP实现的折半查找算法示例
Dec 19 PHP
php 替换文章中的图片路径,下载图片到本地服务器的方法
Feb 06 PHP
thinkphp框架实现路由重定义简化url访问地址的方法分析
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
php 禁止页面缓存输出
2009/01/07 PHP
php获取用户IPv4或IPv6地址的代码
2012/11/15 PHP
php实现的农历算法实例
2015/08/11 PHP
汇总PHPmailer群发Gmail的常见问题
2016/02/24 PHP
PHP中利用sleep函数实现定时执行功能实现代码
2016/08/25 PHP
微信公众平台开发(五) 天气预报功能开发
2016/12/03 PHP
用JavaScript显示随机图像或引用
2009/04/21 Javascript
Jquery AJAX 框架的使用方法
2009/11/03 Javascript
Jquery 扩展方法
2010/05/06 Javascript
情人节专属 纯js脚本1k大小的3D玫瑰效果
2012/02/11 Javascript
你必须知道的Javascript知识点之&quot;this指针&quot;的应用
2013/04/23 Javascript
JQuery的自定义事件代码,触发,绑定简单实例
2013/08/01 Javascript
JS中Location使用详解
2015/05/12 Javascript
Bootstrap实现弹性搜索框
2016/07/11 Javascript
jQuery实现上传图片前预览效果功能
2017/08/03 jQuery
vue的事件绑定与方法详解
2017/08/16 Javascript
Easy UI动态树点击文字实现展开关闭功能
2017/09/30 Javascript
JS生成随机打乱数组的方法示例
2017/12/23 Javascript
webpack项目调试以及独立打包配置文件的方法
2018/02/28 Javascript
vue 监听屏幕高度的实例
2018/09/05 Javascript
vant 解决tab切换插件标题样式自定义的问题
2020/11/13 Javascript
从CentOS安装完成到生成词云python的实例
2017/12/01 Python
python2与python3的print及字符串格式化小结
2018/11/30 Python
Python文件夹批处理操作代码实例
2020/07/21 Python
Django mysqlclient安装和使用详解
2020/09/17 Python
python设置中文界面实例方法
2020/10/27 Python
微信浏览器左上角返回按钮拦截功能
2017/11/21 HTML / CSS
南非最大的花卉和送礼服务:NetFlorist
2017/09/13 全球购物
英国第一独立滑雪板商店:The Snowboard Asylum
2020/01/16 全球购物
几个人围成一圈的问题
2013/09/26 面试题
生物科学专业职业规划书范文
2014/02/11 职场文书
生日宴会主持词
2014/03/20 职场文书
学雷锋先进个人事迹
2014/05/26 职场文书
上海世博会志愿者口号
2014/06/17 职场文书
舞蹈教育学专业求职信
2014/06/29 职场文书
python实战之90行代码写个猜数字游戏
2021/04/22 Python