我正在尝试根据用户 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
都是唯一的,但列表中的一个条目总是比其他所有条目获得更多的活动。有没有更好的方法来生成一个字符串的哈希值,它会给出一个近似均匀的分布?显然 SHA 不能胜任这项工作。我也试过 MD5 和一个简单的 crc32,结果都一样!?
我疯了吗?实际上,我没有验证的唯一解释是每个条目$arr
都是唯一的吗?