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 相关文章推荐
让你同时上传 1000 个文件 (一)
Oct 09 PHP
用PHP制作的意见反馈表源码
Mar 11 PHP
PHP 解决utf-8和gb2312编码转换问题
Mar 18 PHP
fleaphp rolesNameField bug解决方法
Apr 23 PHP
如何用phpmyadmin设置mysql数据库用户的权限
Jan 09 PHP
php-perl哈希算法实现(times33哈希算法)
Dec 30 PHP
php使用curl和正则表达式抓取网页数据示例
Apr 13 PHP
CI框架中zip类应用示例
Jun 17 PHP
php中字符集转换iconv函数使用总结
Oct 11 PHP
php中删除、清空session的方式总结
Oct 09 PHP
PHP获取用户客户端真实IP的解决方案
Oct 10 PHP
PHP实现腾讯与百度坐标转换
Aug 05 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/03/03 PHP
ThinkPHP在新浪SAE平台的部署实例
2014/10/31 PHP
php使用ffmpeg获取视频信息并截图的实现方法
2016/05/03 PHP
PHP基于curl post实现发送url及相关中文乱码问题解决方法
2017/11/25 PHP
php封装的page分页类完整实例代码
2020/02/01 PHP
简单实例处理url特殊符号&amp;处理(2种方法)
2013/04/02 Javascript
JavaScript伸缩的菜单简单示例
2013/12/03 Javascript
jquery使用append(content)方法注意事项分享
2014/01/06 Javascript
HTML5使用DeviceOrientation实现摇一摇功能
2015/06/05 Javascript
跟我学习javascript的函数和函数表达式
2015/11/16 Javascript
JavaScript检测原始值、引用值、属性
2016/06/20 Javascript
原生JS实现左右箭头选择日期实例代码
2017/03/14 Javascript
HTML5+jQuery实现搜索智能匹配功能
2017/03/24 jQuery
nodejs+websocket实时聊天系统改进版
2017/05/18 NodeJs
Angularjs中使用轮播图指令swiper
2017/05/30 Javascript
Node.js中流(stream)的使用方法示例
2017/07/16 Javascript
JS实现微信摇一摇原理解析
2017/07/22 Javascript
详解让sublime text3支持Vue语法高亮显示的示例
2017/09/29 Javascript
解决node修改后需频繁手动重启的问题
2018/05/13 Javascript
Vue路由history模式解决404问题的几种方法
2018/09/29 Javascript
vue中渲染对象中属性时显示未定义的解决
2020/07/31 Javascript
全局安装 Vue cli3 和 继续使用 Vue-cli2.x操作
2020/09/08 Javascript
由Python运算π的值深入Python中科学计算的实现
2015/04/17 Python
python 产生token及token验证的方法
2018/12/26 Python
Python基础教程之异常详解
2019/01/10 Python
python 实现手机自动拨打电话的方法(通话压力测试)
2019/08/08 Python
8段用于数据清洗Python代码(小结)
2019/10/31 Python
Python实现bilibili时间长度查询的示例代码
2020/01/14 Python
指针和引用有什么区别
2013/01/13 面试题
C++是不是类型安全的
2014/02/18 面试题
自我评价200字分享
2013/12/17 职场文书
庆国庆活动总结
2014/08/28 职场文书
连锁超市项目计划书
2014/09/15 职场文书
2015年科室工作总结
2015/04/10 职场文书
vue项目支付功能代码详解
2022/02/18 Vue.js
Linux磁盘管理方法介绍
2022/06/01 Servers