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 str_pad 函数使用详解
Jan 13 PHP
PHP为表单获取的URL 地址预设 http 字符串函数代码
May 26 PHP
php实现用户在线时间统计详解
Oct 08 PHP
php mail to 配置详解
Jan 16 PHP
PHP错误Allowed memory size of 67108864 bytes exhausted的3种解决办法
Jul 28 PHP
自己写的php中文截取函数mb_strlen和mb_substr
Feb 09 PHP
php实现发送微信模板消息的方法
Mar 07 PHP
PHP开启opcache提升代码性能
Apr 26 PHP
php结合md5实现的加密解密方法
Jan 25 PHP
老生常谈ThinkPHP中的行为扩展和插件(推荐)
May 05 PHP
laravel自定义分页的实现案例offset()和limit()
Oct 15 PHP
php正则表达式使用方法整理集合
Jan 31 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 攻击方法之谈php+mysql注射语句构造
2009/10/30 PHP
PHP Memcached + APC + 文件缓存封装实现代码
2010/03/11 PHP
php中常用的预定义变量小结
2012/05/09 PHP
PHP+MySQL统计该库中每个表的记录数并按递减顺序排列的方法
2016/02/15 PHP
Netbeans 8.2与PHP相关的新特性介绍
2016/10/08 PHP
PHP验证码无法显示的原因及解决办法
2017/08/11 PHP
jQuery获取CSS样式中的颜色值的问题,不同浏览器格式不同的解决办法
2013/05/13 Javascript
通过JQuery将DIV的滚动条滚动到指定的位置方便自动定位
2014/05/05 Javascript
jquery中$(#form :input)与$(#form input)的区别
2014/08/18 Javascript
jquery+html5制作超酷的圆盘时钟表
2015/04/14 Javascript
解决拦截器对ajax请求的拦截实例详解
2016/12/21 Javascript
初识NodeJS服务端开发入门(Express+MySQL)
2017/04/07 NodeJs
JS判断Android、iOS或浏览器的多种方法(四种方法)
2017/06/29 Javascript
如何让你的JS代码更好看易读
2017/12/01 Javascript
vue实现模态框的通用写法推荐
2018/02/26 Javascript
微信小程序分享海报生成的实现方法
2018/12/10 Javascript
ES6 Iterator接口和for...of循环用法分析
2019/07/31 Javascript
Vue 简单实现前端权限控制的示例
2020/12/25 Vue.js
Python常见数据结构详解
2014/07/24 Python
使用Python下的XSLT API进行web开发的简单教程
2015/04/15 Python
python使用Queue在多个子进程间交换数据的方法
2015/04/18 Python
Python Numpy:找到list中的np.nan值方法
2018/10/30 Python
钉钉群自定义机器人消息Python封装的实例
2019/02/20 Python
Django模板获取field的verbose_name实例
2020/05/19 Python
python邮件中附加文字、html、图片、附件实现方法
2021/01/04 Python
松下电器美国官方商店:Panasonic美国
2016/10/14 全球购物
财务主管的岗位职责
2013/12/30 职场文书
优秀辅导员事迹材料
2014/02/16 职场文书
晚会主持词开场白
2014/03/17 职场文书
2014年民政局关于保密工作整改措施
2014/09/19 职场文书
2016大学自主招生推荐信范文
2015/03/23 职场文书
2016年过年放假安排通知
2015/08/18 职场文书
Python 如何实现文件自动去重
2021/06/02 Python
浅谈怎么给Python添加类型标注
2021/06/08 Python
JavaScript利用html5新方法操作元素类名详解
2021/11/27 Javascript
vue elementUI表格控制对应列
2022/04/13 Vue.js