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 相关文章推荐
不用数据库的多用户文件自由上传投票系统(1)
Oct 09 PHP
PHP安全技术之 实现php基本安全
Sep 04 PHP
php中全局变量global的使用演示代码
May 18 PHP
apache+php完美解决301重定向的两种方法
Jun 08 PHP
phpMyAdmin出现无法载入 mcrypt 扩展,请检查PHP配置的解决方法
Mar 26 PHP
简单谈谈php中的unicode和utf8编码
Jun 10 PHP
PHP自带方法验证邮箱是否存在
Feb 01 PHP
浅谈PHP正则中的捕获组与非捕获组
Jul 18 PHP
PHP微信分享开发详解
Jan 14 PHP
Laravel中如何增加自定义全局函数详解
May 09 PHP
基于php双引号中访问数组元素报错的解决方法
Feb 01 PHP
thinkPHP框架动态配置用法实例分析
Jun 14 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/06/14 PHP
php设计模式之简单工厂模式详解
2014/09/04 PHP
php获取本周星期一具体日期的方法
2015/04/20 PHP
ThinkPHP控制器详解
2015/07/27 PHP
用PHP写的一个冒泡排序法的函数简单实例
2016/05/26 PHP
php实现基于pdo的事务处理方法示例
2017/07/21 PHP
JavaScript 基础问答三
2008/12/03 Javascript
jQuery快速上手:写jQuery与直接写JS的区别详细解析
2013/08/26 Javascript
jQuery学习笔记之jQuery动画效果
2013/09/09 Javascript
js中日期的加减法
2015/05/06 Javascript
JS函数定义方式的区别介绍
2016/03/22 Javascript
基于jQuery实现顶部导航栏功能
2016/12/27 Javascript
Node.js复制文件的方法示例
2016/12/29 Javascript
详解Angularjs在控制器(controller.js)中使用过滤器($filter)格式化日期/时间实例
2017/02/17 Javascript
JavaScript设计模式之策略模式详解
2017/06/09 Javascript
VueJs 将接口用webpack代理到本地的方法
2017/11/27 Javascript
ajax请求+vue.js渲染+页面加载的示例
2018/02/11 Javascript
vue中手机号,邮箱正则验证以及60s发送验证码的实例
2018/03/16 Javascript
jQuery实现获取及设置CSS样式操作详解
2018/09/05 jQuery
layer ui插件显示tips时,修改字体颜色的实现方法
2019/09/11 Javascript
微信小程序实现按字母排列选择城市功能
2019/11/25 Javascript
跟老齐学Python之Import 模块
2014/10/13 Python
python函数局部变量用法实例分析
2015/08/04 Python
Pytorch 中retain_graph的用法详解
2020/01/07 Python
Tensorflow 使用pb文件保存(恢复)模型计算图和参数实例详解
2020/02/11 Python
python爬取天气数据的实例详解
2020/11/20 Python
python 实现的IP 存活扫描脚本
2020/12/10 Python
python使用scapy模块实现ARP扫描的过程
2021/01/21 Python
HTML5的postMessage的使用手册
2018/12/19 HTML / CSS
英国家庭、花园、汽车和移动解决方案:Easylife Group
2018/05/23 全球购物
泰国Robinson百货官网:购买知名品牌的商品
2020/02/08 全球购物
大学生自助营养快餐店创业计划书
2014/01/13 职场文书
校园元旦活动总结
2014/07/09 职场文书
群众路线教育实践活动方案
2014/10/31 职场文书
2015年司法局工作总结
2015/05/22 职场文书
Python中第三方库Faker的使用详解
2022/04/02 Python