《PHP實例:PHP Hash算法:Times33算法代碼實例》要點:
本文介紹了PHP實例:PHP Hash算法:Times33算法代碼實例,希望對您有用。如果有疑問,可以聯系我們。
PHP編程最近看書,里面提到了一些Hash算法.比較有印象的是Times33,當時理解不是很透測,本日寫了段程序來驗證了一下.
先上代碼:
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編程以上有兩個測試用例.第一個,用CRC32的辦法;第二個是Times33的算法實現.
PHP編程后果:
PHP編程結果分布,兩種算法平起平坐(估計是數據源的問題,md5只有0-f).也有文章說CRC32的分布更均勻(參考鏈接:)
但耗費時間,CRC32比Times33快將近一倍.
PHP編程為什么是33?
PHP編程等于素數(質數),也是奇數.除了33,還有131, 1313, 5381等.PHP內置的Hash函數用的是5381,在“鳥哥”的一篇博文中也有提到.
歡迎參與《PHP實例:PHP Hash算法:Times33算法代碼實例》討論,分享您的想法,維易PHP學院為您提供專業教程。