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 相关文章推荐
多文件上传的例子
Oct 09 PHP
fleaphp常用方法分页之Pager使用方法
Apr 23 PHP
php下通过curl抓取yahoo boss 搜索结果的实现代码
Jun 10 PHP
PHP学习散记_编码(json_encode 中文不显示)
Nov 10 PHP
Uncaught exception com_exception with message Failed to create COM object
Jan 11 PHP
round robin权重轮循算法php实现代码
May 28 PHP
PHP处理数组和XML之间的互相转换
Jun 02 PHP
Thinkphp 中 distinct 的用法解析
Dec 14 PHP
php+ajax实现异步上传文件或图片功能
Jul 18 PHP
PHP实现模拟http请求的方法分析
Dec 20 PHP
Laravel框架运行出错提示RuntimeException No application encryption key has been specified.解决方法
Apr 02 PHP
php 输出缓冲 Output Control用法实例详解
Mar 03 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 抽象方法与抽象类abstract关键字介绍及应用
2014/10/16 PHP
php中使用session防止用户非法登录后台的方法
2015/01/27 PHP
php获得文件大小和文件创建时间的方法
2015/03/13 PHP
Yii全局函数用法示例
2017/01/22 PHP
PHP 实现页面静态化的几种方法
2017/07/23 PHP
PHP仿tp实现mvc框架基本设计思路与实现方法分析
2018/05/23 PHP
js给onclick事件赋值,动态传参数实例解说
2013/03/28 Javascript
js触发select onchange事件的小技巧
2014/08/05 Javascript
使用node.js 制作网站前台后台
2014/11/13 Javascript
WebGL利用FBO完成立方体贴图效果完整实例(附demo源码下载)
2016/01/26 Javascript
页面get请求 中文参数方法乱码问题的快速解决方法
2016/05/31 Javascript
jQuery中的一些常见方法小结(推荐)
2016/06/13 Javascript
基于JSON格式数据的简单jQuery幻灯片插件(jquery-slider)
2016/08/10 Javascript
每个程序员都需要学习 JavaScript 的7个理由小结
2016/09/03 Javascript
JS触摸屏网页版仿app弹窗型滚动列表选择器/日期选择器
2016/10/30 Javascript
JavaScript调试的多个必备小Tips
2017/01/15 Javascript
jQuery使用方法
2017/02/04 Javascript
基于JavaScript实现图片剪切效果
2017/03/07 Javascript
nodejs简单读写excel内容的方法示例
2018/03/16 NodeJs
VUE 配置vue-devtools调试工具及安装方法
2018/09/30 Javascript
vue如何根据网站路由判断页面主题色详解
2018/11/02 Javascript
javascript/jquery实现点击触发事件的方法分析
2019/11/11 jQuery
vue项目中使用vue-layer弹框插件的方法
2020/03/11 Javascript
Python中subprocess模块用法实例详解
2015/05/20 Python
利用selenium 3.7和python3添加cookie模拟登陆的实现
2017/11/20 Python
关于Python内存分配时的小秘密分享
2019/09/05 Python
keras 权重保存和权重载入方式
2020/05/21 Python
基于Python下载网络图片方法汇总代码实例
2020/06/24 Python
python中执行smtplib失败的处理方法
2020/07/01 Python
python的flask框架难学吗
2020/07/31 Python
Python 读取位于包中的数据文件
2020/08/07 Python
python制作一个简单的gui 数据库查询界面
2020/11/19 Python
澳大利亚厨房和家用电器购物网站:Bing Lee
2021/01/11 全球购物
高三毕业典礼主持词
2014/03/27 职场文书
聘任证明怎么写
2015/03/02 职场文书
ubuntu端向日葵键盘输入卡顿问题及解决
2022/12/24 Servers