我发现了这段 PHP 代码,可以生成随机字符串(包括字母、字母数字组合、纯数字和十六进制)。
如果我使用默认参数运行此函数(生成仅包含字母的8个字符字符串),并生成100万个字符串,则我认为我的冲突率应该很低:
实际上,当我在我的机器上运行此代码时,90%的冲突率!只有10%的字符串是唯一的。
实际上,这个数字可疑地接近10%。生成多组1,000,000个随机字符串,我发现每组生成...
- 100,032个独特字符串 - 100,035个独特字符串 - 100,032个独特字符串 - 100,028个独特字符串 - 100,030个独特字符串 - 你懂的
那么问题出在哪里呢?显然与如何种子化mt_srand有关,或php如何实现mt_rand,或其他原因。
那么...
为什么这段代码不能生成有用的随机字符串?
有什么更好的方法吗?
<?php
function random($length = 8, $seeds = 'alpha') {
// Possible seeds
$seedings['alpha'] = 'abcdefghijklmnopqrstuvwqyz';
$seedings['numeric'] = '0123456789';
$seedings['alphanum'] = 'abcdefghijklmnopqrstuvwqyz0123456789';
$seedings['hexidec'] = '0123456789abcdef';
// Choose seed
if (isset($seedings[$seeds])) {
$seeds = $seedings[$seeds];
}
// Seed generator
list($usec, $sec) = explode(' ', microtime());
$seed = (float) $sec + ((float) $usec * 100000);
mt_srand($seed);
// Generate
$str = '';
$seeds_count = strlen($seeds);
for ($i = 0; $length > $i; $i++) {
$str .= $seeds{mt_rand(0, $seeds_count - 1)};
}
return $str;
}
?>
如果我使用默认参数运行此函数(生成仅包含字母的8个字符字符串),并生成100万个字符串,则我认为我的冲突率应该很低:
26^8 = 208,827,064,576
1,000,000 / 208,827,064,576 ~= 0.0004%
实际上,当我在我的机器上运行此代码时,90%的冲突率!只有10%的字符串是唯一的。
实际上,这个数字可疑地接近10%。生成多组1,000,000个随机字符串,我发现每组生成...
- 100,032个独特字符串 - 100,035个独特字符串 - 100,032个独特字符串 - 100,028个独特字符串 - 100,030个独特字符串 - 你懂的
那么问题出在哪里呢?显然与如何种子化mt_srand有关,或php如何实现mt_rand,或其他原因。
那么...
为什么这段代码不能生成有用的随机字符串?
有什么更好的方法吗?