この記事では主に PHP ハッシュ アルゴリズム: Times33 アルゴリズムのコード例を紹介しますので、必要な方は実装コードを直接参照してください。
最近読んだ本で、いくつかのハッシュ アルゴリズムについて言及しました。一番印象に残ったのはTimes33で、当時はよく理解していなかったので、今日プログラムを書いて検証してみました。まずコードを入力してください:
コードをコピーします。コードは次のとおりです:
/**
* CRC32ハッシュ関数
* @param $str
* @return int
*/
関数 hash32($str)
{
crc32($str) を返します >> 16 & 0x7FFFFFFF;
}
/**
* Times33ハッシュ関数
* @param $str
* @return int
*/
関数 hash33($str)
{
$hash = 0;
for($i=0; $i
$hash += 33 * $hash + ord($str{$i});
}
$hash & 0x7FFFFFFF; を返します
}
$n = 10;
// テストケース 1
$stat = array();
for($i=0; $i $str = substr(md5(microtime(true)), 0, 8);
$p = hash32($str) % $n;
if(isset($stat[$p])){
$stat[$p]++;
}その他{
$stat[$p] = 1;
}
}
print_r($stat);
// テストケース 2
$stat = array();
for($i=0; $i $str = substr(md5(microtime(true)), 0, 8);
$p = hash33($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なのか
それは素数(素数)であり、奇数でもあります。 33以外にも131、1313、5381などがあります。 PHP の組み込みハッシュ関数は 5381 を使用します。これは、「Brother Bird」のブログ投稿でも言及されています。