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 相关文章推荐
优化NFR之一 --MSSQL Hello Buffer Overflow
Oct 09 PHP
用PHP与XML联手进行网站编程代码实例
Jul 10 PHP
php面向对象全攻略 (十七) 自动加载类
Sep 30 PHP
php快速url重写 更新版[需php 5.30以上]
Apr 20 PHP
php中static静态变量的使用方法详解
Jun 04 PHP
php函数指定默认值方法的小例子
Dec 04 PHP
PHP jQuery表单,带验证具体实现方法
Feb 15 PHP
PHP中基本HTTP认证技巧分析
Mar 16 PHP
PHP模板解析类实例
Jul 09 PHP
利用PHP判断是手机移动端还是PC端访问的函数示例
Dec 14 PHP
PHP校验15位和18位身份证号的类封装
Nov 07 PHP
总结PHP中初始化空数组的最佳方法
Feb 13 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
php加密解密函数authcode的用法详细解析
2013/10/28 PHP
PHP随机生成随机个数的字母组合示例
2014/01/14 PHP
PHP也能干大事 随机函数
2015/04/14 PHP
php str_getcsv把字符串解析为数组的实现方法
2017/04/05 PHP
二级域名转向类
2006/11/09 Javascript
JavaScript数据类型详解
2015/04/01 Javascript
Windows系统下Node.js的简单入门教程
2015/06/23 Javascript
javascript实现二级级联菜单的简单制作
2015/11/19 Javascript
详解javascript实现自定义事件
2016/01/19 Javascript
Extjs4.0 ComboBox如何实现三级联动
2016/05/11 Javascript
javascript显示倒计时控制按钮的简单实现
2016/06/07 Javascript
jQuery简单实现iframe的高度根据页面内容自适应的方法
2016/08/01 Javascript
Vue 2.0学习笔记之Vue中的computed属性
2017/10/16 Javascript
node.js处理前端提交的GET请求
2019/08/30 Javascript
微信小程序修改数组长度的问题的解决
2019/12/17 Javascript
[03:24]DOTA2超级联赛专访hao 大翻盘就是逆袭
2013/05/24 DOTA
简单的通用表达式求10乘阶示例
2014/03/03 Python
Django中的Signal代码详解
2018/02/05 Python
python通过ffmgep从视频中抽帧的方法
2018/12/05 Python
使用Python 统计高频字数的方法
2019/01/31 Python
python3 tcp的粘包现象和解决办法解析
2019/12/09 Python
利用python绘制正态分布曲线
2021/01/04 Python
浅谈HTML5 &amp; CSS3的新交互特性
2016/07/19 HTML / CSS
前端水印的简单实现代码示例
2020/12/02 HTML / CSS
中国海淘族值得信赖的海淘返利网站:55海淘
2017/01/16 全球购物
化工专业应届生求职信
2013/11/08 职场文书
业务助理岗位职责
2013/11/18 职场文书
《台湾的蝴蝶谷》教学反思
2014/02/20 职场文书
班级文化标语
2014/06/23 职场文书
公司委托书怎么写
2014/08/02 职场文书
小学生放飞梦想演讲稿
2014/08/26 职场文书
光学与应用专业毕业生求职信
2014/09/01 职场文书
模范教师材料大全
2014/12/16 职场文书
五一放假通知怎么写
2015/08/18 职场文书
2016新教师岗前培训心得体会
2016/01/08 职场文书
Python面向对象之成员相关知识总结
2021/06/24 Python