PHP内核——hash算法
2016-07-09 00:00
531 查看
php的hash算法是采用典型的DJBX33A算法
原理:
hash(i) = hash(i-1)*33 + str[i]
hash(0) = 5381
php内部实现:
Apache和Perl中采用的是Times33算法
算法思想跟DJBX33A基本一致
对比两个算法发现不同之处主要有两点:1、初始值2、移位与乘。显然DJB33A的效率要更高一点。对于php初始值为什么选择5381,可能是使用经验值吧~
原理:
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,可能是使用经验值吧~
相关文章推荐
- php文件操作 复制 上传
- php内核机制——魔术方法
- thinkphp模型
- PHP内核探索——入门
- PHP内核探索——PHP反射机制
- php+mysql在线人数统计
- 基于PHP的排列组合(如输入a,b,c 输出他们的全部组合)
- 基数排序的PHP实现
- php字符串翻转
- PHP 中的魔术方法记录
- 使用 trait 时报PHP Parse error: syntax error, unexpect
- 单元测试phpunit安装及使用实例
- Day9作业:socket之FTP工具
- Discuz X3.2实现手机号登录
- 异曲同工之妙之java虚拟机和php内核
- H.264之编码格式-封装成MP4格式-视频流 RTP封包
- php rabbitmq操作类及生产者和消费者实例代码
- yii2-国际化,可参考开发文档权威指南-国际化
- php 上传文件 cvs文件
- PHP面向对象知识总结