【发布时间】:2015-05-01 15:42:56
【问题描述】:
我一直在测试 PHP 中生成值的随机性,并且一直在考虑使用 32 位十六进制来表示给定时间范围内的唯一状态。
我写了这个简单的测试脚本:
$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;
}
令人惊讶的是(对我来说)这个脚本在不到 100,000 次迭代中生成了一个副本,并且低至 1000 次迭代。
我的问题是,我在这里做错了吗?在 40 亿种可能性中,这种频率水平似乎太不可能了。
【问题讨论】:
-
CRC 不是随机的,它是一个校验和
-
我会说这是意料之中的,因为生日“悖论”。
-
我已经更新了这个问题,因为 crc32 并不是真正的主题,只是最终产品。
-
如果这不是主题,请停止在代码中使用 crc32c?
标签: php hash cryptography crc32