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
解析php dirname()与__FILE__常量的应用
Jun 24 PHP
PHP实现读取一个1G的文件大小
Aug 24 PHP
ThinkPHP权限认证Auth实例详解
Jul 22 PHP
php提示Failed to write session data错误的解决方法
Dec 17 PHP
THINKPHP2.0到3.0有哪些改进之处
Jan 04 PHP
zend framework中使用memcache的方法
Mar 04 PHP
关于PHP内置的字符串处理函数详解
Feb 04 PHP
PHP命名空间namespace的定义方法详解
Mar 29 PHP
php 删除指定文件夹的实例讲解
Jul 25 PHP
PHP类与对象后期静态绑定操作实例详解
Dec 20 PHP
深入理解PHP+Mysql分布式事务与解决方案
Dec 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 session 检测和注销
2009/03/16 PHP
php在程序中将网页生成word文档并提供下载的代码
2012/10/09 PHP
Yii框架引用插件和ckeditor中body与P标签去除的方法
2017/01/19 PHP
代码生成器 document.write()
2007/04/15 Javascript
javascript 框架小结 个人工作经验
2009/06/13 Javascript
javascript利用初始化数据装配模版的实现代码
2010/11/17 Javascript
js 如何实现对数据库的增删改查
2012/11/23 Javascript
Js 冒泡事件阻止实现代码
2013/01/27 Javascript
用js来刷新当前页面保留参数的具体实现
2013/12/23 Javascript
javascript正则表达式定义(语法)总结
2016/01/08 Javascript
简单介绍jsonp 使用小结
2016/01/27 Javascript
AngularJS基础 ng-selected 指令简单示例
2016/08/03 Javascript
分类解析jQuery选择器
2016/11/23 Javascript
jQuery实现圣诞节礼物动画案例解析
2016/12/25 Javascript
Angular的自定义指令以及实例
2016/12/26 Javascript
nodejs连接mysql数据库简单封装示例-mysql模块
2017/04/10 NodeJs
详解vue express启动数据服务
2017/07/05 Javascript
VsCode插件整理(小结)
2017/09/14 Javascript
使用vuex的state状态对象的5种方式
2018/04/19 Javascript
JavaScript偏函数与柯里化实例详解
2019/03/27 Javascript
微信小程序之onLaunch与onload异步问题详解
2019/03/28 Javascript
Easyui 关闭jquery-easui tab标签页前触发事件的解决方法
2019/04/28 jQuery
Python爬虫PyQuery库基本用法入门教程
2018/08/04 Python
深入理解Django自定义信号(signals)
2018/10/15 Python
解决python 找不到module的问题
2020/02/12 Python
解决tensorflow/keras时出现数组维度不匹配问题
2020/06/29 Python
置业顾问岗位职责
2014/03/02 职场文书
门前三包责任书
2014/04/15 职场文书
消防安全承诺书
2014/05/22 职场文书
志愿者爱心公益活动策划方案
2014/09/15 职场文书
大学生就业协议书范本(适用于公司企业)
2014/10/07 职场文书
个人廉洁自律总结
2015/03/06 职场文书
2015年企业员工工作总结范文
2015/05/21 职场文书
欠条格式范本
2015/07/03 职场文书
迎新生欢迎词2015
2015/07/16 职场文书
多人股份制合作协议书
2016/03/19 职场文书