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 has encountered an Access Violation
Jan 15 PHP
关于mysql 字段的那个点为是定界符
Jan 15 PHP
15种PHP Encoder的比较
Mar 06 PHP
PHP中文编码小技巧
Dec 25 PHP
PHP中的替代语法介绍
Jan 09 PHP
php+mysql数据库查询实例
Jan 21 PHP
PHP中的类型提示(type hinting)功能介绍
Jul 01 PHP
php实现简易聊天室应用代码
Sep 23 PHP
PHP中功能强大却很少使用的函数实例小结
Nov 10 PHP
PHP从零开始打造自己的MVC框架之路由类实现方法分析
Jun 03 PHP
PHP防止sql注入小技巧之sql预处理原理与实现方法分析
Dec 13 PHP
关于Anemometer图形化显示MySQL慢日志的工具搭建及使用的详细介绍
Jul 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
linux下删除7天前日志的代码(php+shell)
2011/01/02 PHP
深入讲解PHP的对象注入(Object Injection)
2017/03/01 PHP
PHP网页安全认证的实例详解
2017/09/28 PHP
PHP类与对象后期静态绑定操作实例详解
2018/12/20 PHP
JavaScript RegExp方法获取地址栏参数(面向对象)
2009/03/10 Javascript
javascript中注册和移除事件的4种方式
2013/03/20 Javascript
JS中 用户登录系统的解决办法
2013/04/15 Javascript
javascript获取网页中指定节点的父节点、子节点的方法小结
2013/04/24 Javascript
jQuery Animation实现CSS3动画示例介绍
2013/08/14 Javascript
JS数组去重与取重的示例代码
2014/01/24 Javascript
jQuery判断对象是否存在的方法
2015/02/05 Javascript
为何JS操作的href都是javascript:void(0);呢
2015/11/12 Javascript
ES6概念 Symbol toString()方法
2016/12/25 Javascript
详解Vue.js Mixins 混入使用
2017/09/15 Javascript
Vue 中批量下载文件并打包的示例代码
2017/11/20 Javascript
Vue+Mock.js模拟登录和表格的增删改查功能
2018/07/26 Javascript
如何在vue里添加好看的lottie动画
2018/08/02 Javascript
Django+Vue实现WebSocket连接的示例代码
2019/05/28 Javascript
vue路由分文件拆分管理详解
2020/08/13 Javascript
JS实现斐波那契数列的五种方式(小结)
2020/09/09 Javascript
js+css3实现简单时钟特效
2020/09/13 Javascript
[01:10:57]Liquid vs OG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python打印输出数组中全部元素
2018/03/13 Python
Django框架自定义session处理操作示例
2019/05/27 Python
Python上下文管理器用法及实例解析
2019/11/11 Python
Python多重继承之菱形继承的实例详解
2020/02/12 Python
python-xpath获取html文档的部分内容
2020/03/06 Python
Python collections模块的使用方法
2020/10/09 Python
家长给小学生的评语
2014/01/30 职场文书
全国道德模范事迹
2014/02/01 职场文书
简单的大学生自我鉴定
2014/02/18 职场文书
2014年计生标语
2014/06/23 职场文书
道路运输企业安全生产责任书
2014/07/28 职场文书
个人自查自纠材料
2014/10/14 职场文书
mysql定时自动备份数据库的方法步骤
2021/07/07 MySQL
Windows11性能真的上涨35%? 桌面酷睿i9实测结果公开
2021/11/21 数码科技