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 相关文章推荐
md5 16位二进制与32位字符串相互转换示例
Dec 30 PHP
实现PHP多线程异步请求的3种方法
Jan 17 PHP
初识php MVC
Sep 10 PHP
Laravel中使用阿里云OSS Composer包分享
Feb 10 PHP
php实现ip白名单黑名单功能
Mar 12 PHP
PHP Try-catch 语句使用技巧
Feb 28 PHP
PHP创建多级目录的两种方法
Oct 28 PHP
CI框架常用函数封装实例
Nov 21 PHP
php获取当前url地址的方法小结
Jan 10 PHP
Windows平台实现PHP连接SQL Server2008的方法
Jul 26 PHP
PHP序列化的四种实现方法与横向对比
Nov 29 PHP
PHP合并两个或多个数组的方法
Jan 20 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
使用无限生命期Session的方法
2006/10/09 PHP
用PHP读取超大文件的实例代码
2012/04/01 PHP
PHP实现通用alert函数的方法
2015/03/11 PHP
PHPStrom 新建FTP项目以及在线操作教程
2016/10/16 PHP
PHP切割整数工具类似微信红包金额分配的思路详解
2019/09/18 PHP
JS中彻底删除JSON对象组成的数组中的元素
2020/09/22 PHP
ThinkPHP5分页paginate代码实例解析
2020/11/10 PHP
ExtJS 2.0 实用简明教程之布局概述
2009/04/29 Javascript
DOM 基本方法
2009/07/18 Javascript
JavaScript中__proto__与prototype的关系深入理解
2012/12/04 Javascript
JS实现多物体缓冲运动实例代码
2013/11/29 Javascript
Javascript中引用示例介绍
2014/02/21 Javascript
jquery实现更改表格行顺序示例
2014/04/30 Javascript
浅析jquery与checkbox的checked属性的问题
2016/04/27 Javascript
概述javascript在Google IE中的调试技巧
2016/11/24 Javascript
自定义require函数让浏览器按需加载Js文件
2016/11/24 Javascript
JS按钮闪烁功能的实现代码
2017/07/21 Javascript
基于滚动条位置判断的简单实例
2017/12/14 Javascript
浅谈angularJS2中的界面跳转方法
2018/08/31 Javascript
React 路由懒加载的几种实现方案
2018/10/23 Javascript
jQuery创建折叠式菜单
2019/06/15 jQuery
20个必会的JavaScript面试题(小结)
2019/07/02 Javascript
vue 查看dist文件里的结构(多种方式)
2020/01/17 Javascript
JavaScript实现猜数字游戏
2020/05/20 Javascript
基于JS实现操作成功之后自动跳转页面
2020/09/25 Javascript
Python实现批量读取图片并存入mongodb数据库的方法示例
2018/04/02 Python
解决python字典对值(值为列表)赋值出现重复的问题
2019/01/20 Python
局域网内python socket实现windows与linux间的消息传送
2019/04/19 Python
英国知名的护肤彩妆与时尚配饰大型综合零售电商:Unineed
2016/11/21 全球购物
JPA的特点
2014/10/25 面试题
军训自我鉴定
2014/01/22 职场文书
跳槽求职信范文
2014/05/26 职场文书
2014教师党员自我评议(5篇)
2014/09/20 职场文书
微信小程序实现拍照和相册选取图片
2021/05/09 Javascript
Python 可迭代对象 iterable的具体使用
2021/08/07 Python
利用python做数据拟合详情
2021/11/17 Python