ユーザー ID に基づいて乱数を均等に分散させようとしています。つまり、ユーザーが乱数を要求するたびに同じままである各ユーザーの乱数が必要です (ただし、ユーザーは番号を保存する必要はありません)。特定のユーザーIDの大きな配列に対して、分布をカウントする私の現在のアルゴリズム(PHP)は次のとおり$arr
です。
$range = 100;
$results = array_fill(0, $range, 0);
foreach ($arr as $userID) {
$hash = sha1($userID,TRUE);
$data = unpack('L*', $hash);
$seed = 0;
foreach ($data as $integer) {
$seed ^= $integer;
}
srand($seed);
++$results[rand(0, $range-1)];
}
これにより、ほぼ均等な分布が生成されることが期待されます。しかし、そうではありません!の各値が一意であることを確認しました$arr
が、リスト内の 1 つのエントリは常に他のすべてのエントリよりも多くのアクティビティを取得します。ほぼ均等に分布する文字列のハッシュを生成するより良い方法はありますか? どうやらSHAは仕事をしていないようです。MD5と単純なcrc32も試しましたが、すべて同じ結果でした!?
私はクレイジーですか?$arr
実際、各エントリが一意であることを確認していない唯一の説明はありますか?