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 session 错误
May 21 PHP
php程序效率优化的一些策略小结
Jul 17 PHP
php中explode与split的区别介绍
Oct 03 PHP
php检测图片木马多进制编程实践
Apr 11 PHP
php配合jquery实现增删操作具体实例
Dec 12 PHP
php根据生日计算年龄的方法
Jul 13 PHP
完美利用Yii2微信后台开发的系列总结
Jul 18 PHP
浅谈PHP的$_SERVER[SERVER_NAME]
Feb 04 PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
Aug 28 PHP
详解在YII2框架中使用UEditor编辑器发布文章
Nov 02 PHP
PHP创建文件及写入数据(覆盖写入,追加写入)的方法详解
Feb 15 PHP
php如何获取Http请求
Apr 30 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检测用户是否用手机(Mobile)访问网站的类
2014/01/09 PHP
php实现给图片加灰色半透明效果的方法
2014/10/20 PHP
codeigniter显示所有脚本执行时间的方法
2015/03/21 PHP
php实现简单加入购物车功能
2017/03/07 PHP
一个javascript图片阅览组件
2010/11/09 Javascript
jQuery Ajax请求状态管理器打包
2012/05/03 Javascript
js如何判断不同系统的浏览器类型
2013/10/28 Javascript
文档对象模型DOM通俗讲解
2013/11/01 Javascript
innerText 使用示例
2014/01/23 Javascript
Javascript的严格模式strict mode详细介绍
2014/06/06 Javascript
jQuery实现流动虚线框的方法
2015/01/29 Javascript
每天一篇javascript学习小结(基础知识)
2015/11/10 Javascript
谈谈jQuery Ajax用法详解
2015/11/27 Javascript
Bootstrap Paginator分页插件使用方法详解
2016/05/30 Javascript
jQuery动态修改字体大小的方法【测试可用】
2016/09/09 Javascript
JavaScript编写一个贪吃蛇游戏
2017/03/09 Javascript
jQuery异步提交表单实例
2017/05/30 jQuery
原生JS发送异步数据请求
2017/06/08 Javascript
javascript ES6 新增了let命令使用介绍
2017/07/07 Javascript
jQuery实现左右滑动的toggle方法
2018/03/03 jQuery
Vue项目中跨域问题解决方案
2018/06/05 Javascript
Vue验证码60秒倒计时功能简单实例代码
2018/06/22 Javascript
JS面试题大坑之隐式类型转换实例代码
2018/10/14 Javascript
Nodejs让异步变成同步的方法
2019/03/02 NodeJs
vue 项目引入echarts 添加点击事件操作
2020/09/09 Javascript
Python Web框架Flask中使用新浪SAE云存储实例
2015/02/08 Python
Python3导入CSV文件的实例(跟Python2有些许的不同)
2018/06/22 Python
python实现简单图片物体标注工具
2019/03/18 Python
pytorch实现mnist分类的示例讲解
2020/01/10 Python
详解Python中pyautogui库的最全使用方法
2020/04/01 Python
写一个函数返回1+2+3+…+n的值(假定结果不会超过长整型变量的范围)
2014/09/05 面试题
八年级音乐教学反思
2014/01/09 职场文书
大二法学专业职业生涯规划范文
2014/02/12 职场文书
行政秘书工作自我鉴定
2014/09/15 职场文书
新郎父亲婚礼致辞
2015/07/27 职场文书
教师反邪教心得体会
2016/01/15 职场文书