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&amp;mysql(二)
Oct 09 PHP
深入php之规范编程命名小结
May 15 PHP
如何批量替换相对地址为绝对地址(利用bat批处理实现)
May 27 PHP
destoon首页调用求购供应信息的地区名称的方法
Aug 21 PHP
PHP计算日期相差天数实例分析
Feb 23 PHP
PHP生成及获取JSON文件的方法
Aug 23 PHP
PHP面向对象自动加载机制原理与用法分析
Oct 14 PHP
php使用gd2绘制基本图形示例(直线、圆、正方形)
Feb 15 PHP
php批量删除操作(数据访问)
May 23 PHP
PHP unlink与rmdir删除目录及目录下所有文件实例代码
Feb 07 PHP
Ubuntu彻底删除PHP7.0的方法
Jul 27 PHP
针对PHP开发安全问题的相关总结
Mar 22 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/10/28 PHP
在Ubuntu 14.04上部署 PHP 环境及 WordPress
2014/09/02 PHP
PHP数组函数知识汇总
2016/05/12 PHP
PHP设计模式之委托模式定义与用法简单示例
2018/08/13 PHP
PHP保留两位小数的几种方法
2019/07/24 PHP
ECMAScript 基础知识
2007/06/29 Javascript
JS获取随机数函数可自定义最小值最大值
2014/05/08 Javascript
js获取checkbox复选框选中的选项实例
2014/08/24 Javascript
Angular中的Promise对象($q介绍)
2015/03/03 Javascript
JavaScript学习笔记(三):JavaScript也有入口Main函数
2015/09/12 Javascript
js判断手机访问或者PC的几个例子(常用于手机跳转)
2015/12/15 Javascript
ReactNative-JS 调用原生方法实例代码
2016/10/08 Javascript
老生常谈Javascript中的原型和this指针
2016/10/09 Javascript
详解Vue 非父子组件通信方法(非Vuex)
2017/05/24 Javascript
jQuery插件ImgAreaSelect实现头像上传预览和裁剪功能实例讲解一
2017/05/26 jQuery
vue使用better-scroll实现下拉刷新、上拉加载
2018/11/23 Javascript
vue滚动tab跟随切换效果
2020/06/29 Javascript
iSlider手机端图片滑动切换插件使用详解
2019/12/24 Javascript
微信小程序点击view动态添加样式过程解析
2020/01/21 Javascript
vue页面跳转实现页面缓存操作
2020/07/22 Javascript
基于vue 动态菜单 刷新空白问题的解决
2020/08/06 Javascript
Vue Object.defineProperty及ProxyVue实现双向数据绑定
2020/09/02 Javascript
js实现简单的倒计时
2021/01/28 Javascript
[00:52]DOTA2齐天大圣预告片
2016/08/13 DOTA
python GUI库图形界面开发之PyQt5单行文本框控件QLineEdit详细使用方法与实例
2020/02/27 Python
PyCharm中如何直接使用Anaconda已安装的库
2020/05/28 Python
Python数据相关系数矩阵和热力图轻松实现教程
2020/06/16 Python
python中有帮助函数吗
2020/06/19 Python
利用python爬取有道词典的方法
2020/12/08 Python
Melijoe美国官网:法国奢侈童装购物网站
2017/04/19 全球购物
标记环网Toke Ring IEEE802.5
2014/05/26 面试题
思想专业自荐信范文
2013/12/25 职场文书
魅力教师事迹材料
2014/01/10 职场文书
国贸专业大学生职业生涯规划范文
2014/01/10 职场文书
文明家庭事迹材料
2014/12/20 职场文书
标枪加油稿
2015/07/22 职场文书