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中截取字符串支持utf-8
Jan 18 PHP
PHP5与MySQL数据库操作常用代码 收集
Mar 21 PHP
php设计模式 Adapter(适配器模式)
Jun 26 PHP
PHP学习笔记 用户注册模块用户类以及验证码类
Sep 20 PHP
Php Ctemplate引擎开发相关内容
Mar 03 PHP
php实现在线通讯录功能(附源码)
May 13 PHP
PHP生成静态HTML文档实现代码
Jun 23 PHP
PHP实现二维数组按某列进行排序的方法
Nov 18 PHP
PHP实现批量清空删除指定文件夹所有内容的方法
May 30 PHP
PHP回调函数与匿名函数实例详解
Aug 16 PHP
PHP实现的解汉诺塔问题算法示例
Aug 06 PHP
laravel csrf排除路由,禁止,关闭指定路由的例子
Oct 21 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 Error与Logging函数的深入理解
2013/06/03 PHP
解析php session_set_save_handler 函数的用法(mysql)
2013/06/29 PHP
实例讲解yii2.0在php命令行中运行的步骤
2015/12/01 PHP
PHP结合Vue实现滚动底部加载效果
2017/12/17 PHP
js操作时间(年-月-日 时-分-秒 星期几)
2010/06/20 Javascript
jQuery中die()方法用法实例
2015/01/19 Javascript
javascript显示上周、上个月日期的处理方法
2016/02/03 Javascript
微信JS接口大全
2016/08/25 Javascript
react-router4 嵌套路由的使用方法
2017/07/24 Javascript
详解Angular5 服务端渲染实战
2018/01/04 Javascript
Vue中render方法的使用详解
2018/01/26 Javascript
Node.js API详解之 readline模块用法详解
2020/05/22 Javascript
vue 出现data-v-xxx的原因及解决
2020/08/04 Javascript
python实现根据图标提取分类应用程序实例
2014/09/28 Python
python Matplotlib画图之调整字体大小的示例
2017/11/20 Python
python实现QQ邮箱/163邮箱的邮件发送
2019/01/22 Python
python 安装教程之Pycharm安装及配置字体主题,换行,自动更新
2020/03/13 Python
解决pyPdf和pyPdf2在合并pdf时出现异常的问题
2020/04/03 Python
Python根据指定文件生成XML的方法
2020/06/29 Python
Python paramiko使用方法代码汇总
2020/11/20 Python
css3学习系列之移动属性详解
2017/07/04 HTML / CSS
详解如何获取localStorage最大存储大小的方法
2020/05/21 HTML / CSS
印尼在线精品店:Berrybenka.com
2016/10/22 全球购物
互动出版网:专业书籍
2017/03/21 全球购物
英国皇家邮政海外旗舰店:Royal Mail
2018/02/21 全球购物
7 For All Mankind官网:美国加州洛杉矶的高级牛仔服装品牌
2018/12/20 全球购物
介绍下Java的输入输出流
2014/01/22 面试题
细节决定成败演讲稿
2014/05/12 职场文书
幼儿老师求职信
2014/06/30 职场文书
2014年控辍保学工作总结
2014/12/08 职场文书
倡议书作文
2015/01/19 职场文书
道歉的话怎么说
2015/05/12 职场文书
大学毕业论文致谢词
2015/05/14 职场文书
2015年乡镇食品安全工作总结
2015/10/22 职场文书
MySQL优化及索引解析
2022/03/17 MySQL
mysql中关键词exists的用法实例详解
2022/06/10 MySQL