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中文乱码
Nov 26 PHP
PHP生成Flash动画的实现代码
Mar 12 PHP
PHP和Mysqlweb应用开发核心技术 第1部分 Php基础-3 代码组织和重用2
Jul 03 PHP
MySQL的FIND_IN_SET函数使用方法分享
Mar 27 PHP
PHP中header和session_start前不能有输出原因分析
Jan 11 PHP
PHP下获取上个月、下个月、本月的日期(strtotime,date)
Feb 02 PHP
PHP实现的博客欢迎提示功能(很特别哦)
Jun 05 PHP
函数中使用require_once问题深入探讨 优雅的配置文件定义方法推荐
Jul 02 PHP
微信公众号开发之微信公共平台消息回复类实例
Nov 14 PHP
php中namespace及use用法分析
Dec 06 PHP
PHP大文件分割上传 PHP分片上传
Aug 28 PHP
yii2多图上传组件的使用教程
May 10 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 设计模式之 工厂模式
2008/12/19 PHP
PHP下对字符串的递增运算代码
2010/08/21 PHP
第四章 php数学运算
2011/12/30 PHP
php curl的深入解析
2013/06/02 PHP
php+mysql实现数据库随机重排实例
2014/10/17 PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
2017/08/28 PHP
jQuery Ajax文件上传(php)
2009/06/16 Javascript
javascript中的startWith和endWith的几种实现方法
2013/05/07 Javascript
深入理解javascript构造函数和原型对象
2014/09/23 Javascript
innerHTML动态添加html代码和脚本兼容多个浏览器
2014/10/11 Javascript
JavaScript获取当前cpu使用率的方法
2015/12/15 Javascript
JS表格组件神器bootstrap table详解(强化版)
2016/05/26 Javascript
完美JQuery图片切换效果的简单实现
2016/07/21 Javascript
JS获取和修改元素样式的实例代码
2016/08/06 Javascript
easyUI实现类似搜索框关键词自动提示功能示例代码
2016/12/27 Javascript
浅谈Angular.js中使用$watch监听模型变化
2017/01/10 Javascript
纯JS实现可用于页码更换的飞页特效示例
2018/05/21 Javascript
小程序图片剪裁加旋转的示例代码
2018/07/10 Javascript
微信小程序 Storage更新详解
2019/07/16 Javascript
微信小程序动态设置图片大小的方法
2019/11/21 Javascript
[02:38]DOTA2亚洲邀请赛小组赛精彩集锦:Wings完美团击溃对手
2017/03/29 DOTA
python之wxPython菜单使用详解
2014/09/28 Python
老生常谈python之鸭子类和多态
2017/06/13 Python
Python multiprocess pool模块报错pickling error问题解决方法分析
2019/03/20 Python
django 模型中的计算字段实例
2020/05/19 Python
Python连接Impala实现步骤解析
2020/08/04 Python
详解HTML5 录音的踩坑之旅
2017/12/26 HTML / CSS
伦敦一家西班牙童装精品店:La Coqueta
2018/02/02 全球购物
会计专业大学生职业生涯规划范文
2014/01/11 职场文书
人事文员岗位职责
2014/02/16 职场文书
授权委托书格式模板
2014/04/03 职场文书
第二课堂活动总结
2014/05/07 职场文书
2014年中秋节活动总结
2014/08/29 职场文书
幼儿园小班教师个人工作总结
2015/02/06 职场文书
2015年信访维稳工作总结
2015/04/07 职场文书
一次MySQL启动导致的事故实战记录
2021/09/15 MySQL