PHP Hash算法:Times33算法代碼實(shí)例
最近看書,里面提到了一些Hash算法。比較有印象的是Times33,當(dāng)時(shí)理解不是很透測(cè),今天寫了段程序來(lái)驗(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ù)源的問(wèn)題,md5只有0-f)。也有文章說(shuō)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)文章
laravel 5.3 單用戶登錄簡(jiǎn)單實(shí)現(xiàn)方法
今天小編就為大家分享一篇laravel 5.3 單用戶登錄簡(jiǎn)單實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-10-10
php判斷頁(yè)面是否是微信打開的示例(微信打開網(wǎng)頁(yè))
今天遇到一問(wèn)題,讓一個(gè)頁(yè)面在微信上打開,PC上不能直接打開,下面是我使用的方法,現(xiàn)在分享給大家2014-04-04
PHP數(shù)據(jù)庫(kù)鏈接類(PDO+Access)實(shí)例分享
這篇文章主要介紹了PHP數(shù)據(jù)庫(kù)鏈接類(PDO+Access),有需要的朋友可以參考一下2013-12-12
基于jQueryUI和Corethink實(shí)現(xiàn)百度的搜索提示功能
這篇文章主要介紹了基于jQueryUI和Corethink實(shí)現(xiàn)百度的搜索提示功能,這里是以corethink模塊的形式,只需要安裝上訪問(wèn)index.php?s=/test/index 就可以了,需要的朋友可以參考下2016-11-11
php創(chuàng)建多級(jí)目錄完整封裝類操作方法
下面小編就為大家?guī)?lái)一篇php創(chuàng)建多級(jí)目錄完整封裝類操作方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08
laravel框架上傳圖片實(shí)現(xiàn)實(shí)時(shí)預(yù)覽功能
今天小編就為大家分享一篇laravel框架上傳圖片實(shí)現(xiàn)實(shí)時(shí)預(yù)覽功能,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-10-10
php反序列化長(zhǎng)度變化尾部字符串逃逸(0CTF-2016-piapiapia)
這篇文章主要介紹了0CTF-2016-piapiapia(php反序列化長(zhǎng)度變化尾部字符串逃逸),本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02
Laravel獲取所有的數(shù)據(jù)庫(kù)表及結(jié)構(gòu)的方法
今天小編就為大家分享一篇Laravel獲取所有的數(shù)據(jù)庫(kù)表及結(jié)構(gòu)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-10-10
CI框架數(shù)據(jù)庫(kù)查詢緩存優(yōu)化的方法
這篇文章主要介紹了CI框架數(shù)據(jù)庫(kù)查詢緩存優(yōu)化的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了CI框架中緩存的開啟、關(guān)閉、使用、清空等相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2016-11-11

