最近、いくつかのハッシュ アルゴリズムについて言及した本を読みました。一番印象に残ったのはTimes33で、当時はよく理解していなかったので、今日プログラムを書いて検証してみました。
まずコード:
コードをコピーします コードは次のとおりです:
/**
* CRC32ハッシュ関数
* @param $str
* @return int
*/
関数 hash32($str)
{
crc32($str) >> 16 & 0x7FFFFFFF; を返します
}
* Times33 ハッシュ関数
* @param $str
* @return int
*/
関数 hash33($str)
{
$ハッシュ = 0;
for($i=0; $i
$ハッシュ & 0x7FFFFFFF を返します
}
$n = 10;
//テストケース 1
$stat = 配列();
for($i=0; $i
$str = substr(md5(microtime(true)), 0, 8);
$p = ハッシュ32($str) % $n;
If(isset($stat[$p])){
$stat[$p]++
}その他{
$stat[$p] = 1;
}
}
print_r($stat);
//テストケース 2
$stat = 配列();
for($i=0; $i
$str = substr(md5(microtime(true)), 0, 8);
$p = ハッシュ33($str) % $n;
If(isset($stat[$p])){
$stat[$p]++
}その他{
$stat[$p] = 1;
}
print_r($stat);
上記には 2 つのテストケースがあります。 1 つ目は CRC32 メソッドを使用し、2 つ目は Times33 アルゴリズムの実装です。
効果:
結果の分布、2 つのアルゴリズムは同等です (おそらくデータ ソースに問題があり、md5 には 0-f しかありません)。 CRC32の方が均等に分布しているという記事もあります(参考リンク:)
ただし、時間がかかります。CRC32 は Times33 のほぼ 2 倍高速です。
素数(素数)と奇数です。 33以外にも131、1313、5381などがあります。 PHP の組み込みハッシュ関数は 5381 を使用します。これは、「Brother Bird」のブログ投稿でも言及されています。
http://www.bkjia.com/PHPjc/998814.html
www.bkjia.comtrue
http://www.bkjia.com/PHPjc/998814.html
技術記事