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 相关文章推荐
如何去掉文章里的 html 语法
Oct 09 PHP
从Web查询数据库之PHP与MySQL篇
Sep 25 PHP
关于访问控制的一首PHP面试题(对属性或方法的访问控制)
Sep 13 PHP
PHP书写格式详解(必看)
May 23 PHP
php 输出json及显示json中的中文汉字详解及实例
Nov 09 PHP
php 魔术常量详解及实例代码
Dec 04 PHP
PHP中仿制 ecshop验证码实例
Jan 06 PHP
php获取给定日期相差天数的方法分析
Feb 20 PHP
Laravel框架路由设置与使用示例
Jun 12 PHP
PHP输出Excel PHPExcel的方法
Jul 26 PHP
PHP实现文字写入图片功能
Feb 18 PHP
php使用Swoole实现毫秒级定时任务的方法
Sep 04 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 安全过滤函数代码
2011/05/07 PHP
php中0,null,empty,空,false,字符串关系的详细介绍
2013/06/20 PHP
PHP+MySQL插入操作实例
2015/01/21 PHP
laravel使用Faker数据填充的实现方法
2019/04/12 PHP
JavaScript中继承的一些示例方法与属性参考
2010/08/07 Javascript
Node.js中使用计时器定时执行函数详解
2014/08/15 Javascript
jQuery使用prepend()方法在元素前添加内容用法实例
2015/03/26 Javascript
基于JavaScript实现通用tab选项卡(通用性强)
2016/01/07 Javascript
Bootstrap弹出框(modal)垂直居中的问题及解决方案详解
2016/06/12 Javascript
JS触摸屏网页版仿app弹窗型滚动列表选择器/日期选择器
2016/10/30 Javascript
JS动态遍历json中所有键值对的方法(不知道属性名的情况)
2016/12/28 Javascript
三种方式实现瀑布流布局
2017/02/10 Javascript
Javascript实现找不同色块的游戏
2017/07/17 Javascript
利用jquery如何从json中读取数据追加到html中
2017/12/01 jQuery
最实用的JS数组函数整理
2017/12/05 Javascript
在Vue中使用echarts的方法
2018/02/05 Javascript
一个简单的node.js界面实现方法
2018/06/01 Javascript
JavaScript引用类型Object常见用法实例分析
2018/08/08 Javascript
JavaScript实现动态添加、移除元素或属性的方法分析
2019/01/03 Javascript
详解vue-cli3多页应用改造
2019/06/04 Javascript
微信小程序 数据缓存实现方法详解
2019/08/26 Javascript
手把手教您实现react异步加载高阶组件
2020/04/07 Javascript
[16:56]heroes英雄教学 司夜刺客
2014/09/18 DOTA
[04:52]DOTA2亚洲邀请赛附加赛 TOP10精彩集锦
2015/01/29 DOTA
为什么你还不懂得怎么使用Python协程
2019/05/13 Python
python如何爬取网站数据并进行数据可视化
2019/07/08 Python
django-rest-swagger对API接口注释的方法
2019/08/29 Python
Pytorch转keras的有效方法,以FlowNet为例讲解
2020/05/26 Python
Python 操作SQLite数据库的示例
2020/10/16 Python
Python 求向量的余弦值操作
2021/03/04 Python
使用phonegap创建联系人的实现方法
2017/03/30 HTML / CSS
小学教育毕业生自荐信
2013/11/18 职场文书
活动策划求职信模板
2014/04/21 职场文书
详解Python小数据池和代码块缓存机制
2021/04/07 Python
图文详解Nginx版本平滑升级方案
2021/09/15 Servers
python实现双向链表原理
2022/05/25 Python