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 相关文章推荐
PHP4实际应用经验篇(9)
Oct 09 PHP
繁体中文转换为简体中文的PHP函数
Oct 09 PHP
在windows iis5下安装php4.0+mysql之我见
Oct 09 PHP
PHP连接access数据库
Mar 27 PHP
php动态生成函数示例
Mar 21 PHP
smarty内置函数capture用法分析
Jan 22 PHP
PHP+AJAX实现投票功能的方法
Sep 28 PHP
Yii多表联合查询操作详解
Jun 02 PHP
PHP中empty,isset,is_null用法和区别
Feb 19 PHP
Yii2.0使用阿里云OSS的SDK上传图片、下载、删除图片示例
Sep 20 PHP
PHP单文件上传原理及上传函数的封装操作示例
Sep 02 PHP
浅谈laravel-admin form中的数据,在提交后,保存前,获取并进行编辑
Oct 21 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
怎么使 Mysql 数据同步
2006/10/09 PHP
PHPThumb PHP 图片缩略图库
2012/03/11 PHP
php实现批量下载百度云盘文件例子分享
2014/04/10 PHP
基于JavaScript 声明全局变量的三种方式详解
2013/05/07 Javascript
jQuery如何实现点击页面获得当前点击元素的id或其他信息
2014/01/09 Javascript
javascript实例--教你实现扑克牌洗牌功能
2014/05/15 Javascript
node.js中的fs.lchmodSync方法使用说明
2014/12/16 Javascript
html的DOM中document对象images集合用法实例
2015/01/21 Javascript
JS正则RegExp.test()使用注意事项(不具有重复性)
2016/12/28 Javascript
Nodejs实现的操作MongoDB数据库功能完整示例
2019/02/02 NodeJs
Vue移动端右滑屏幕返回上一页附源码下载
2019/06/26 Javascript
vue canvas绘制矩形并解决由clearRec带来的闪屏问题
2019/09/02 Javascript
Nuxt的路由配置和参数传递方式
2020/11/06 Javascript
二种python发送邮件实例讲解(python发邮件附件可以使用email模块实现)
2013/12/03 Python
python实现zencart产品数据导入到magento(python导入数据)
2014/04/03 Python
Collatz 序列、逗号代码、字符图网格实例
2017/06/22 Python
python 同时运行多个程序的实例
2019/01/07 Python
python游戏开发之视频转彩色字符动画
2019/04/26 Python
Ubuntu18.04中Python2.7与Python3.6环境切换
2019/06/14 Python
python 计算平均平方误差(MSE)的实例
2019/06/29 Python
详解python播放音频的三种方法
2019/09/23 Python
Python使用Opencv实现图像特征检测与匹配的方法
2019/10/30 Python
如何使用python实现模拟鼠标点击
2020/01/06 Python
Python语言异常处理测试过程解析
2020/01/08 Python
Python导入模块包原理及相关注意事项
2020/03/25 Python
使用npy转image图像并保存的实例
2020/07/01 Python
Python scrapy爬取小说代码案例详解
2020/07/09 Python
HTML5 embed标签定义和用法详解
2014/05/09 HTML / CSS
详解HTML5中CSS外观属性
2020/09/10 HTML / CSS
全球最大的跑步用品商店:Road Runner Sports
2016/09/11 全球购物
施华洛世奇新加坡官网:SWAROVSKI新加坡
2020/10/06 全球购物
优秀教师获奖感言
2014/01/31 职场文书
平安建设实施方案
2014/03/19 职场文书
小学生放飞梦想演讲稿
2014/08/26 职场文书
Python爬虫中urllib3与urllib的区别是什么
2021/07/21 Python
微软Win11有哪些隐藏功能? windows11多个功能汇总
2021/11/21 数码科技