《PHP實(shí)例:PHP Hash算法:Times33算法代碼實(shí)例》要點(diǎn):
本文介紹了PHP實(shí)例:PHP Hash算法:Times33算法代碼實(shí)例,希望對(duì)您有用。如果有疑問,可以聯(lián)系我們。
PHP編程最近看書,里面提到了一些Hash算法.比較有印象的是Times33,當(dāng)時(shí)理解不是很透測(cè),本日寫了段程序來驗(yàn)證了一下.
先上代碼:
PHP編程/**
?* CRC32 Hash function
?* @param $str
?* @return int
?*/
function hash32($str)
{
??? return crc32($str) >> 16 & 0x7FFFFFFF;
}
PHP編程/**
?* 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;
}
PHP編程
$n = 10;
PHP編程// 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);
PHP編程// 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);
PHP編程以上有兩個(gè)測(cè)試用例.第一個(gè),用CRC32的辦法;第二個(gè)是Times33的算法實(shí)現(xiàn).
PHP編程后果:
PHP編程結(jié)果分布,兩種算法平起平坐(估計(jì)是數(shù)據(jù)源的問題,md5只有0-f).也有文章說CRC32的分布更均勻(參考鏈接:)
但耗費(fèi)時(shí)間,CRC32比Times33快將近一倍.
PHP編程為什么是33?
PHP編程等于素?cái)?shù)(質(zhì)數(shù)),也是奇數(shù).除了33,還有131, 1313, 5381等.PHP內(nèi)置的Hash函數(shù)用的是5381,在“鳥哥”的一篇博文中也有提到.
歡迎參與《PHP實(shí)例:PHP Hash算法:Times33算法代碼實(shí)例》討論,分享您的想法,維易PHP學(xué)院為您提供專業(yè)教程。
轉(zhuǎn)載請(qǐng)注明本頁網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/10873.html