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 相关文章推荐
我的论坛源代码(二)
Oct 09 PHP
用PHP和ACCESS写聊天室(七)
Oct 09 PHP
第九节--绑定
Nov 16 PHP
剖析 PHP 中的输出缓冲
Dec 21 PHP
php 随机记录mysql rand()造成CPU 100%的解决办法
May 18 PHP
浅谈PHP中Stream(流)
Jun 08 PHP
php轻松实现文件上传功能
Mar 03 PHP
php 防止表单重复提交两种实现方法
Nov 03 PHP
CI框架AR数据库操作常用函数总结
Nov 21 PHP
PHP开发中解决并发问题的几种实现方法分析
Nov 13 PHP
php pdo连接数据库操作示例
Nov 18 PHP
Laravel + Elasticsearch 实现中文搜索的方法
Feb 02 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/10/24 PHP
nginx+php-fpm配置文件的组织结构介绍
2012/11/07 PHP
解析crontab php自动运行的方法
2013/06/24 PHP
PHP使用array_multisort对多个数组或多维数组进行排序
2014/12/16 PHP
php微信开发之批量生成带参数的二维码
2016/06/26 PHP
浅谈PHP表单提交(POST&amp;GET&amp;URL编/解码)
2017/04/03 PHP
JQuery 将元素显示在屏幕的中央的代码
2010/02/27 Javascript
JS实现点击下载的小例子
2013/07/10 Javascript
jquery结合CSS使用validate实现漂亮的验证
2015/01/29 Javascript
Javascript6中字符串的四个新用法分享
2016/09/11 Javascript
微信小程序 本地存储及登录页面处理实例详解
2017/01/11 Javascript
详解基于Node.js的微信JS-SDK后端接口实现代码
2017/07/15 Javascript
使用Nodejs连接mongodb数据库的实现代码
2017/08/21 NodeJs
vue iView 上传组件之手动上传功能
2018/03/16 Javascript
微信小程序扫描二维码获取信息实例详解
2019/05/07 Javascript
使用 Element UI Table 的 slot-scope方法
2019/10/10 Javascript
JavaScript中的this基本问题实例小结
2020/03/09 Javascript
基于Vue.js+Nuxt开发自定义弹出层组件
2020/10/09 Javascript
[56:42]完美世界DOTA2联赛循环赛 Matador vs Forest 第二场 11.06
2020/11/06 DOTA
python创建只读属性对象的方法(ReadOnlyObject)
2013/02/10 Python
Python实现模拟时钟代码推荐
2015/11/08 Python
python模拟预测一下新型冠状病毒肺炎的数据
2020/02/01 Python
Python栈的实现方法示例【列表、单链表】
2020/02/22 Python
python为Django项目上的每个应用程序创建不同的自定义404页面(最佳答案)
2020/03/09 Python
世界首屈一指的钓鱼用品商店:TackleDirect
2016/07/26 全球购物
丝芙兰法国官网:SEPHORA法国
2016/09/01 全球购物
拉夫劳伦爱尔兰官方网站:Ralph Lauren爱尔兰
2020/04/10 全球购物
全球异乡人的跨境社交电商平台:Kouhigh口嗨网
2020/07/24 全球购物
实习销售业务员自我鉴定
2013/09/21 职场文书
大学军训感言1500字
2014/03/09 职场文书
会计学自荐信
2014/06/03 职场文书
爱情保证书
2015/01/17 职场文书
信用卡工作证明范本
2015/06/19 职场文书
高中班主任培训心得体会
2016/01/07 职场文书
2019年年中职场激励人心语录30条
2019/08/07 职场文书
postgresql使用filter进行多维度聚合的解决方法
2021/07/16 PostgreSQL