PHP Hash算法:Times33算法代码实例


Posted in PHP onMay 13, 2015

最近看书,里面提到了一些Hash算法。比较有印象的是Times33,当时理解不是很透测,今天写了段程序来验证了一下。
先上代码:

<?php
/** 

 * CRC32 Hash function 

 * @param $str 

 * @return int 

 */ 

function hash32($str) 

{ 

    return crc32($str) >> 16 & 0x7FFFFFFF; 

}
/** 

 * Times33 Hash function 

 * @param $str 

 * @return int 

 */ 

function hash33($str) 

{ 

    $hash = 0; 

    for($i=0; $i<strlen($str); $i++) { 

        $hash += 33 * $hash + ord($str{$i}); 

    } 

    return $hash & 0x7FFFFFFF; 

}


$n = 10;
// Test Case 1 

$stat = array(); 

for($i=0; $i<10000; $i++){ 

    $str = substr(md5(microtime(true)), 0, 8); 

    $p = hash32($str) % $n; 

    if(isset($stat[$p])){ 

        $stat[$p]++; 

    }else{ 

        $stat[$p] = 1; 

    } 

} 

print_r($stat);
// Test Case 2 

$stat = array(); 

for($i=0; $i<10000; $i++){ 

    $str = substr(md5(microtime(true)), 0, 8); 

    $p = hash33($str) % $n; 

    if(isset($stat[$p])){ 

        $stat[$p]++; 

    }else{ 

        $stat[$p] = 1; 

    } 

} 

print_r($stat);

以上有两个测试用例。第一个,用CRC32的方法;第二个是Times33的算法实现。

效果:

结果分布,两种算法不相上下(估计是数据源的问题,md5只有0-f)。也有文章说CRC32的分布更均匀(参考链接:)
但耗费时间,CRC32比Times33快将近一倍。

为什么是33?

即是素数(质数),也是奇数。除了33,还有131, 1313, 5381等。PHP内置的Hash函数用的是5381,在“鸟哥”的一篇博文中也有提到。

PHP 相关文章推荐
php中计算时间差的几种方法
Dec 31 PHP
在PHP中操作Excel实例代码
Apr 29 PHP
PHP Session_Regenerate_ID函数双释放内存破坏漏洞
Jan 27 PHP
php安全配置 如何配置使其更安全
Dec 16 PHP
PHP安全性漫谈
Jun 28 PHP
在yii中新增一个用户验证的方法详解
Jun 20 PHP
解析php取整的几种方式
Jun 25 PHP
解析csv数据导入mysql的方法
Jul 01 PHP
PHP的openssl加密扩展使用小结(推荐)
Jul 18 PHP
php+javascript实现的动态显示服务器运行程序进度条功能示例
Aug 07 PHP
统计PHP目录中的文件数方法
Mar 05 PHP
Laravel 手动开关 Eloquent 修改器的操作方法
Dec 30 PHP
你应该知道PHP浮点数知识
May 13 #PHP
PHP浮点数精度问题汇总
May 13 #PHP
PHP生成器简单实例
May 13 #PHP
php实现比较两个字符串日期大小的方法
May 12 #PHP
php使用substr()和strpos()联合查找字符串中某一特定字符的方法
May 12 #PHP
PHP异常处理浅析
May 12 #PHP
php猴子选大王问题解决方法
May 12 #PHP
You might like
?生?D片??C字串
2006/12/06 PHP
php定时计划任务的实现方法详解
2013/06/06 PHP
android上传图片到PHP的过程详解
2015/08/03 PHP
YII中Ueditor富文本编辑器文件和图片上传的配置图文教程
2017/03/15 PHP
PHP获取数组中指定的一列实例
2017/12/27 PHP
用jquery存取照片的具体实现方法
2013/06/30 Javascript
事件委托与阻止冒泡阻止其父元素事件触发
2014/09/02 Javascript
提交按钮的name='submit'引起的js失效问题及原因
2015/02/25 Javascript
JavaScript实现当网页加载完成后执行指定函数的方法
2015/03/21 Javascript
JS基于面向对象实现的拖拽库实例
2015/09/24 Javascript
angular.js4使用 RxJS 处理多个 Http 请求
2017/09/23 Javascript
iframe高度自适应及隐藏滚动条的实例详解
2017/09/29 Javascript
vue-cli中使用高德地图的方法示例
2019/03/28 Javascript
基于layui的table插件进行复选框联动功能的实现方法
2019/09/19 Javascript
Vue3.0数据响应式原理详解
2019/10/09 Javascript
Python自定义scrapy中间模块避免重复采集的方法
2015/04/07 Python
Python+微信接口实现运维报警
2016/08/27 Python
Python中类型检查的详细介绍
2017/02/13 Python
Python 的类、继承和多态详解
2017/07/16 Python
python并发爬虫实用工具tomorrow实用解析
2019/09/25 Python
Django搭建项目实战与避坑细节详解
2020/12/06 Python
python 录制系统声音的示例
2020/12/21 Python
css3 iphone玻璃透明气泡完美实现
2013/03/20 HTML / CSS
css3闪亮进度条效果实现思路及代码
2013/04/17 HTML / CSS
J.Crew官网:美国知名休闲服装品牌
2017/05/19 全球购物
N:Philanthropy官网:美国洛杉矶基础款服装
2020/06/09 全球购物
大学生写自荐信的技巧
2014/01/08 职场文书
酒店管理专业自荐信
2014/05/23 职场文书
旅游饭店管理专业自荐书
2014/06/28 职场文书
小学领导班子对照材料
2014/08/23 职场文书
高一课前三分钟演讲稿
2014/09/13 职场文书
授权委托书样本及填写说明
2014/09/19 职场文书
2014年惩防体系建设工作总结
2014/12/01 职场文书
新闻稿件写作范文
2015/07/18 职场文书
关于flex 上下文中自动 margin的问题(完整例子)
2021/05/20 HTML / CSS
星际争霸 Light vs Action 一场把教主看到鬼畜的比赛
2022/04/01 星际争霸