PHP Hash算法:Times33算法代碼實(shí)例
最近看書,里面提到了一些Hash算法。比較有印象的是Times33,當(dāng)時(shí)理解不是很透測(cè),今天寫了段程序來驗(yàn)證了一下。
先上代碼:
<?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);
以上有兩個(gè)測(cè)試用例。第一個(gè),用CRC32的方法;第二個(gè)是Times33的算法實(shí)現(xiàn)。
效果:
結(jié)果分布,兩種算法不相上下(估計(jì)是數(shù)據(jù)源的問題,md5只有0-f)。也有文章說CRC32的分布更均勻(參考鏈接:)
但耗費(fèi)時(shí)間,CRC32比Times33快將近一倍。
為什么是33?
即是素?cái)?shù)(質(zhì)數(shù)),也是奇數(shù)。除了33,還有131, 1313, 5381等。PHP內(nèi)置的Hash函數(shù)用的是5381,在“鳥哥”的一篇博文中也有提到。
相關(guān)文章
Yii2.0框架behaviors方法使用實(shí)例分析
這篇文章主要介紹了Yii2.0框架behaviors方法使用,結(jié)合實(shí)例形式分析了yii2.0框架控制器 behaviors 過濾數(shù)據(jù)相關(guān)操作技巧與使用注意事項(xiàng),需要的朋友可以參考下2019-09-09php對(duì)數(shù)組排序的簡(jiǎn)單實(shí)例
分享一個(gè)php數(shù)組排序的例子,介紹了和php,有關(guān)的知識(shí)、技巧、經(jīng)驗(yàn),和一些php源碼等2013-12-12php實(shí)現(xiàn)將數(shù)據(jù)做成json的格式給前端使用
今天小編就為大家分享一篇php實(shí)現(xiàn)將數(shù)據(jù)做成json的格式給前端使用方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-08-08Yii2 hasOne(), hasMany() 實(shí)現(xiàn)三表關(guān)聯(lián)的方法(兩種)
這篇文章主要介紹了Yii2 hasOne(), hasMany() 實(shí)現(xiàn)三表關(guān)聯(lián)的方法(兩種),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-02-02nginx簡(jiǎn)單配置多個(gè)php服務(wù)實(shí)例教程
nginx安裝剛安裝好是不能訪問php文件的,需要我們進(jìn)行配置,下面這篇文章主要給大家介紹了關(guān)于nginx簡(jiǎn)單配置多個(gè)php服務(wù)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-01-01PHP類的自動(dòng)加載機(jī)制實(shí)現(xiàn)方法分析
這篇文章主要介紹了PHP類的自動(dòng)加載機(jī)制實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了__autoload方法進(jìn)行類自動(dòng)加載操作的相關(guān)實(shí)現(xiàn)技巧與使用注意事項(xiàng),需要的朋友可以參考下2019-01-01ThinkPHP模板判斷輸出Present標(biāo)簽用法詳解
這篇文章主要介紹了ThinkPHP模板判斷輸出Present標(biāo)簽用法,可用于判斷模板變量是否已經(jīng)賦值,需要的朋友可以參考下2014-06-06