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脚本的10个技巧(8)
Oct 09 PHP
第四节--构造函数和析构函数
Nov 16 PHP
dedecms系统的广告设置代码 基础版本
Apr 09 PHP
基于php常用正则表达式的整理汇总
Jun 08 PHP
解析isset与is_null的区别
Aug 09 PHP
php判断并删除空目录及空子目录的方法
Feb 11 PHP
thinkPHP中分页用法实例分析
Dec 26 PHP
php中的常用魔术方法汇总
Feb 14 PHP
PHP函数引用返回的实例详解
Sep 11 PHP
Laravel Memcached缓存驱动的配置与应用方法分析
Oct 08 PHP
php-fpm服务启动脚本的方法
Apr 27 PHP
Thinkphp5 自定义上传文件名的实现方法
Jul 23 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生成静态页面教程
2012/01/10 PHP
PHP测试程序运行时间的类
2012/02/05 PHP
PHP使用strtotime计算两个给定日期之间天数的方法
2015/03/18 PHP
PHP图片加水印实现方法
2016/05/06 PHP
laravel学习教程之存取器
2016/07/30 PHP
thinkPHP5.0框架引入Traits功能实例分析
2017/03/18 PHP
yii2 commands模式以及配置crontab定时任务的方法
2017/08/19 PHP
javascript实现des解密加密全过程
2014/04/03 Javascript
JavaScript实现下拉列表框数据增加、删除、上下排序的方法
2015/08/11 Javascript
基于MVC4+EasyUI的Web开发框架形成之旅之界面控件的使用
2015/12/16 Javascript
利用js定义一个导航条菜单
2017/03/14 Javascript
JavaScript验证知识整理
2017/03/24 Javascript
vue resource post请求时遇到的坑
2017/10/19 Javascript
nodejs发送http请求时遇到404长时间未响应的解决方法
2017/12/10 NodeJs
在Vue中使用echarts的方法
2018/02/05 Javascript
Vue使用vux-ui自定义表单验证遇到的问题及解决方法
2018/05/10 Javascript
vue.js的vue-cli脚手架中使用百度地图API的实例
2019/01/21 Javascript
微信小程序如何再次获取用户授权的方法
2019/05/10 Javascript
JS将时间秒转换成天小时分钟秒的字符串
2019/07/10 Javascript
vue中如何实现后台管理系统的权限控制的方法步骤
2019/09/05 Javascript
浅谈Layui的eleTree树式选择器使用方法
2019/09/25 Javascript
通过原生vue添加滚动加载更多功能
2019/11/21 Javascript
[01:00:17]DOTA2-DPC中国联赛 正赛 SAG vs Dynasty BO3 第二场 1月25日
2021/03/11 DOTA
Python数据结构之单链表详解
2017/09/12 Python
Selenium元素的常用操作方法分析
2018/08/10 Python
python实现推箱子游戏
2020/03/25 Python
Django框架基础模板标签与filter使用方法详解
2019/07/23 Python
Django models文件模型变更错误解决
2020/05/11 Python
Python实现列表中非负数保留,负数转化为指定的数值方式
2020/06/04 Python
详解python 支持向量机(SVM)算法
2020/09/18 Python
HTML5 Canvas入门学习教程
2016/03/17 HTML / CSS
英国50岁以上人群的交友网站:Ourtime
2018/03/28 全球购物
英国优质家居用品网上品牌:URBANARA
2018/06/01 全球购物
超市商业计划书
2014/05/04 职场文书
小学中等生评语
2014/12/29 职场文书
任命通知范文
2015/04/21 职场文书