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 相关文章推荐
2.PHP入门
Oct 09 PHP
PHP图片等比缩放类SimpleImage使用方法和使用实例分享
Apr 10 PHP
php实现数组中索引关联数据转换成json对象的方法
Jul 08 PHP
PHP请求Socket接口测试实例
Aug 12 PHP
浅谈php中fopen不能创建中文文件名文件的问题
Feb 06 PHP
PHP+AjaxForm异步带进度条上传文件实例代码
Aug 14 PHP
phpStudy配置多站点多域名和多端口的方法
Sep 01 PHP
关于php支持的协议与封装协议总结(推荐)
Nov 17 PHP
ThinkPHP框架实现的邮箱激活功能示例
Jun 15 PHP
laravel 数据迁移与 Eloquent ORM的实现方法
Apr 12 PHP
对laravel的csrf 防御机制详解,及form中csrf_token()的存在介绍
Oct 24 PHP
tp5.1 框架join方法用法实例分析
May 26 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下删除一篇文章生成的多个静态页面
2010/08/08 PHP
Thinkphp3.2.3整合phpqrcode生成带logo的二维码
2016/07/21 PHP
[原创]PHP获取数组表示的路径方法分析【数组转字符串】
2017/09/01 PHP
ThinkPHP5+Layui实现图片上传加预览功能
2018/08/17 PHP
php成功操作redis cluster集群的实例教程
2019/01/13 PHP
php中的buffer缓冲区用法分析
2019/05/31 PHP
JavaScript进阶教程(第四课第一部分)
2007/04/05 Javascript
简单的无缝滚动程序-仅几行代码
2007/05/08 Javascript
jQuery formValidator表单验证插件开源了 含API帮助、源码、示例
2008/08/14 Javascript
jQuery操作select的实例代码
2012/06/14 Javascript
将form表单中的元素转换成对象的方法适用表单提交
2014/05/02 Javascript
JavaScript实现定时隐藏与显示图片的方法
2015/08/06 Javascript
jQuery使用$.ajax进行即时验证的方法
2015/12/08 Javascript
JavaScript跨域调用基于JSON的RESTful API
2016/07/09 Javascript
jquery的checkbox,radio,select等方法小结
2016/08/30 Javascript
jQuery实现页面倒计时并刷新效果
2017/03/13 Javascript
React Native基础入门之初步使用Flexbox布局
2018/07/02 Javascript
vue-better-scroll 的使用实例代码详解
2018/12/03 Javascript
python中字典dict常用操作方法实例总结
2015/04/04 Python
Python logging管理不同级别log打印和存储实例
2018/01/19 Python
pandas按若干个列的组合条件筛选数据的方法
2018/04/11 Python
Python之pandas读写文件乱码的解决方法
2018/04/20 Python
Python根据欧拉角求旋转矩阵的实例
2019/01/28 Python
如何关掉pycharm中的python console(图解)
2019/10/31 Python
使用matlab或python将txt文件转为excel表格
2019/11/01 Python
Python3实现将一维数组按标准长度分隔为二维数组
2019/11/29 Python
python_mask_array的用法
2020/02/18 Python
Python实现读取并写入Excel文件过程解析
2020/05/27 Python
使用CSS3配合IE滤镜实现渐变和投影的效果
2015/09/06 HTML / CSS
html5 canvas的绘制文本自动换行的示例代码
2018/09/17 HTML / CSS
小孩百日宴答谢词
2014/01/15 职场文书
农民工工资支付承诺函
2014/03/31 职场文书
2014年信访维稳工作总结
2014/12/08 职场文书
2015新年寄语大全
2014/12/08 职场文书
清洁工工作总结
2015/08/11 职场文书
使用 MybatisPlus 连接 SqlServer 数据库解决 OFFSET 分页问题
2022/04/22 SQL Server