我一直在测试PHP中生成值的随机性,并且一直在考虑32位十六进制来表示给定时间范围内的唯一状态。PHP伪随机,4字节的随机程度
我写了这个简单的测试脚本:
$checks = [];
$i = 0;
while (true) {
$hash = hash('crc32b', openssl_random_pseudo_bytes(4));
echo $hash . PHP_EOL;
if (in_array($hash, $checks)) {
echo 'Copy: ' . $i . PHP_EOL;
break;
}
$i++;
$checks[] = $hash;
}
令人惊讶(我)这个脚本在不到10万次的迭代,以及低至1000次迭代产生一个副本。
我的问题是,我在这里做错了什么?在40亿种可能性中,这种频率似乎不太可能。
CRC不是随机的,它是一个校验和 –
我想说这是预期的,因为这是一个百日咳“悖论”。 –
我已经更新了这个问题,因为crc32并不是真正的主题,只是最终产品。 – Flosculus