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 相关文章推荐
java EJB 加密与解密原理的一个例子
Jan 11 PHP
优化PHP代码的53条建议
Mar 27 PHP
精通php的十大要点(上)
Feb 04 PHP
PHP 执行系统外部命令 system() exec() passthru()
Aug 11 PHP
PHP 日志缩略名的创建函数代码
May 26 PHP
Mysql数据库操作类( 1127版,提供源码下载 )
Dec 02 PHP
php 归并排序 数组交集
May 10 PHP
php使用异或实现的加密解密实例
Sep 04 PHP
PHP调用JAVA的WebService简单实例
Mar 11 PHP
PHP购物车类Cart.class.php定义与用法示例
Jul 20 PHP
php实现socket推送技术的示例
Dec 20 PHP
PHP实现一个按钮点击上传多个图片操作示例
Jan 23 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
使用Zttp简化Guzzle 调用
2017/07/02 PHP
yii2.0整合阿里云oss删除单个文件的方法
2017/09/19 PHP
Javascript 获取字符串字节数的多种方法
2009/06/02 Javascript
extjs 学习笔记(一) 一些基础知识
2009/10/13 Javascript
JS打开新窗口防止被浏览器阻止的方法
2015/01/03 Javascript
JS+CSS实现实用的单击输入框弹出选择框的方法
2015/02/28 Javascript
Angular.JS中的this指向详解
2017/05/17 Javascript
JavaScript之underscore_动力节点Java学院整理
2017/07/03 Javascript
js实现从左向右滑动式轮播图效果
2017/07/07 Javascript
微信小程序webSocket的使用方法
2020/02/20 Javascript
Vue中通过vue-router实现命名视图的问题
2020/04/23 Javascript
在Vue中使用CSS3实现内容无缝滚动的示例代码
2020/11/27 Vue.js
一文秒懂nodejs中的异步编程
2021/01/28 NodeJs
[02:38]DOTA2 夜魇暗潮2020活动介绍官方视频
2020/11/04 DOTA
python字符串加密解密的三种方法分享(base64 win32com)
2014/01/19 Python
Python最火、R极具潜力 2017机器学习调查报告
2017/12/11 Python
python监控进程脚本
2018/04/12 Python
python 处理数字,把大于上限的数字置零实现方法
2019/01/28 Python
Python实现的在特定目录下导入模块功能分析
2019/02/11 Python
解决Pycharm后台indexing导致不能run的问题
2019/06/27 Python
python脚本之一键移动自定格式文件方法实例
2019/09/02 Python
python 爬取疫情数据的源码
2020/02/09 Python
aws 通过boto3 python脚本打pach的实现方法
2020/05/10 Python
Django+Celery实现动态配置定时任务的方法示例
2020/05/26 Python
Python实现爬取并分析电商评论
2020/06/19 Python
HTML5 Canvas实现平移/放缩/旋转deom示例(附截图)
2013/07/04 HTML / CSS
国际知名军事风格休闲装品牌:Alpha Industries(阿尔法工业)
2017/05/24 全球购物
《藏戏》教学反思
2014/02/11 职场文书
弘扬雷锋精神活动演讲稿
2014/03/04 职场文书
2014年信息技术工作总结
2014/12/16 职场文书
颐和园英文导游词
2015/01/30 职场文书
党员活动总结
2015/02/04 职场文书
经理岗位职责范本
2015/04/15 职场文书
中标通知书
2015/04/17 职场文书
党员反四风学习心得体会
2016/01/22 职场文书
「SHOW BY ROCK!!」“雫シークレットマインド”组合单曲MV公开
2022/03/21 日漫