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 相关文章推荐
escape unescape的php下的实现方法
Apr 27 PHP
获取php页面执行时间,数据库读写次数,函数调用次数等(THINKphp)
Jun 03 PHP
php5.3 注意事项说明
Jul 01 PHP
php对二维数组进行排序的简单实例
Dec 19 PHP
php结合ACCESS的跨库查询功能
Jun 12 PHP
php的debug相关函数用法示例
Jul 11 PHP
PHP Cookie学习笔记
Aug 23 PHP
php array_udiff_assoc 计算两个数组的差集实例
Nov 12 PHP
老生常谈PHP中的数据结构:DS扩展
Jul 17 PHP
PHP递归实现快速排序的方法示例
Dec 18 PHP
PHP判断是否是微信打开,浏览器打开的方法
Mar 14 PHP
解决php扩展安装不生效问题
Oct 25 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中类的继承和用法实例分析
2016/05/24 PHP
JavaScript的Cookies
2008/01/16 Javascript
javascript中的变量是传值还是传址的?
2010/04/19 Javascript
避免 showModalDialog 弹出新窗体的原因分析
2010/05/31 Javascript
菜鸟javascript基础资料整理3 正则
2010/12/06 Javascript
js模仿hover的具体实现代码
2013/12/30 Javascript
原生JavaScript实现合并多个数组示例
2014/09/21 Javascript
使用JQ来编写最基本的淡入淡出效果附演示动画
2014/10/31 Javascript
JavaScript开发人员的10个关键习惯小结
2014/12/05 Javascript
javascript瀑布流布局实现方法详解
2016/02/17 Javascript
BootStrap实现轮播图效果(收藏)
2016/12/30 Javascript
前端自动化开发之Node.js的环境搭建教程
2017/04/01 Javascript
详解刷新页面vuex数据不消失和不跳转页面的解决
2018/01/30 Javascript
vue-cli webpack2项目打包优化分享
2018/02/07 Javascript
vue实现pdf导出解决生成canvas模糊等问题(推荐)
2018/10/18 Javascript
nodemon实现Typescript项目热更新的示例代码
2019/11/19 Javascript
ES5 模拟 ES6 的 Symbol 实现私有成员功能示例
2020/05/06 Javascript
微信小程序实现简单文字跑马灯
2020/05/26 Javascript
[01:32]DOTA2上海特锦赛现场采访:最想COS的英雄
2016/03/25 DOTA
通过C++学习Python
2015/01/20 Python
python实现端口转发器的方法
2015/03/13 Python
python爬虫实例详解
2018/06/19 Python
Python基于pip实现离线打包过程详解
2020/05/15 Python
Django filter动态过滤与排序实现过程解析
2020/11/26 Python
浅析数据存储的三种方式 cookie sessionstorage localstorage 的异同
2020/06/04 HTML / CSS
俄罗斯三星品牌商店:Samsungstore
2020/04/05 全球购物
网络安全方面的面试题
2016/01/07 面试题
初中物理教学反思
2014/01/14 职场文书
考试没考好检讨书
2014/01/31 职场文书
征婚广告词
2014/03/17 职场文书
大二学习计划书范文
2014/04/27 职场文书
商务司机岗位职责
2015/04/10 职场文书
2016教师暑期培训学习心得体会
2016/01/09 职场文书
八年级英语教学反思
2016/02/15 职场文书
2019年妇科护士的自我鉴定(3篇)
2019/09/26 职场文书
通过T-SQL语句创建游标与实现数据库加解密功能
2022/03/16 SQL Server