PHP中用hash实现的数组

2015-01-24信息快讯网
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中的HashTable结构详解
php去除换行符的方法小结(PHP_EOL变量的使用)
PHP 获取文件路径(灵活应用__FILE__)
php设计模式小结
php安全开发 添加随机字符串验证,防止伪造跨站请求
PHP下使用CURL方式POST数据至API接口的代码
php中使用addslashes函数报错问题的解决方法
mysqli_set_charset和SET NAMES使用抉择及优劣分析
PHP/Javascript/CSS/jQuery常用知识大全详细整理第1/2页
关于mysql字符集设置了character_set_client=binary 在gbk情况下会出现表描述是乱码的情况
php和javascript之间变量的传递实现代码
PHP C EasyUI DataGrid 资料存的方式介绍
PHP C EasyUI DataGrid 资料取的方式介绍
PhpMyAdmin出现export.php Missing parameter: what /export_type错误解决方法
openflashchart 2.0 简单案例php版
php提示Call-time pass-by-reference has been deprecated in的解决方法[已测]
PHP 验证码的实现代码
PHP中文分词的简单实现代码分享
PHP 删除文件与文件夹操作 unlink()与rmdir()这两个函数的使用
从手册去理解分析PHP session机制
php数组的一些常见操作汇总
PHP在特殊字符前加斜杠的实现代码
php设计模式 Chain Of Responsibility (职责链模式)
php判断输入不超过mysql的varchar字段的长度范围
PHP5中新增stdClass 内部保留类
PHP中遍历stdclass object的实现代码
rephactor 优秀的PHP的重构工具
PHP数组的交集array_intersect(),array_intersect_assoc(),array_inter_key()函数的小问题
php调用mysql数据 dbclass类
php中处理mysql_fetch_assoc返回来的数组 不用foreach----echo
php HandlerSocket的使用
The specified CGI application misbehaved by not returning a complete set of HTTP headers
理解php Hash函数,增强密码安全
©2014-2024 dbsqp.com