我正在根据以下字符生成 6 位代码。这些将用于在贴纸上盖印。
它们将以 10k 或更少的批次生成(在打印之前),我预计总数不会超过 1-200 万(可能要少得多)。
生成批量代码后,我将检查现有代码的 MySQL 数据库以确保没有重复。
// exclude problem chars: B8G6I1l0OQDS5Z2
$characters = 'ACEFHJKMNPRTUVWXY4937';
$string = '';
for ($i = 0; $i < 6; $i++) {
$string .= $characters[rand(0, strlen($characters) - 1)];
}
return $string;
- 这是生成代码的可靠方法吗?
- 会有多少种可能的排列? (21 个字符池中的 6 位代码)。抱歉数学不是我的强项
21^6 = 85766121 种可能性。
使用数据库并存储使用过的值是不好的。如果你想伪造随机性,可以使用以下命令:
将可能的数字减少到 19 个,并利用 p^k 阶群(其中 p 是奇素数)始终是循环这一事实。
采用 7^19 阶群,使用生成器与 7^19 互质(我会选择 13^11,你可以选择任何不能被 7 整除的值)。
然后进行以下工作:
$previous = 0;
function generator($previous)
{
$generator = pow(13,11);
$modulus = pow(7,19); //int might be too small
$possibleChars = "ACEFHJKMNPRTUVWXY49";
$previous = ($previous + $generator) % $modulus;
$output='';
$temp = $previous;
for($i = 0; $i < 6; $i++) {
$output += $possibleChars[$temp % 19];
$temp = $temp / 19;
}
return $output;
}
它将循环遍历所有可能的值,并且看起来有点随机,除非他们去挖掘。一个更安全的选择是乘法组,但我已经忘记了我的数学:(
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)