PHP内核——hash算法
来源:互联网 发布:mac 无法访问只读文档 编辑:程序博客网 时间:2024/05/21 17:05
php的hash算法是采用典型的DJBX33A算法
原理:
hash(i) = hash(i-1)*33 + str[i]
hash(0) = 5381
php内部实现:
static inline ulong zend_inline_hash_func(char *arKey, uint nKeyLength){ register ulong hash = 5381; /* variant with the hash unrolled eight times */ for (; nKeyLength >= 8; nKeyLength -= 8) { hash = ((hash << 5) + hash) + *arKey++; hash = ((hash << 5) + hash) + *arKey++; hash = ((hash << 5) + hash) + *arKey++; hash = ((hash << 5) + hash) + *arKey++; 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... */ 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;}
Apache和Perl中采用的是Times33算法
算法思想跟DJBX33A基本一致
sub perlhash{ $hash = 0; foreach(split){ $hash = $hash*33 + ord($_); } return hash;}
对比两个算法发现不同之处主要有两点:1、初始值2、移位与乘。显然DJB33A的效率要更高一点。对于php初始值为什么选择5381,可能是使用经验值吧~
0 0
- PHP内核——hash算法
- PHP中的Hash算法
- php hash 算法大全
- php一致性hash算法
- PHP中的Hash算法
- php hash算法
- windows 内核对象hash 算法
- php hashtable的hash算法
- PHP实现:一致性HASH算法
- PHP内核分析-HASH函数
- 算法 哈希(hash——map)
- 海量数据处理 ——hash算法
- 一致性hash算法 —— consistent hashing
- Java之——Hash算法大全
- 摘自PHP的HASH算法实现
- 摘自PHP的HASH算法实现
- 摘自PHP的HASH算法实现
- 摘自PHP的HASH算法实现
- Introduction to Sound Programming with ALSA
- Bind-9.6.0-P1源代码分析之一:整体架构(初稿)
- 三角形类
- Springmvc + mongodb + js 分页显示数据
- 深入理解Java 8 Lambda
- PHP内核——hash算法
- crtmpserver流媒体服务器的介绍与搭建 (转载)
- postgis安装
- opencv VideoCapture调用摄像头无响应问题
- Firebase 教程 —— 一个实时聊天室
- CodeForces 7A Kalevitch and Chess
- php url重写
- Java中级开发工程师知识点归纳
- 【剑指offer系列】 栈的压入和弹出序列___22