我从以下字符生成一个6位数的代码。这些将被用来在贴纸上盖章。
它们将在10k或更少的批次中产生(在打印之前),我不认为会有超过120万的总数(可能更少)。
生成批代码后,我将检查现有代码的MySQL数据库,以确保没有重复代码。
// exclude problem chars: B8G6I1l0OQDS5Z2
$characters = 'ACEFHJKMNPRTUVWXY4937';
$string = '';
for ($i = 0; $i < 6; $i++) {
$string .= $characters[rand(0, strlen($characters) - 1)];
}
return $string;发布于 2013-05-09 23:36:41
21^6 = 85766121种可能性。
使用DB并存储已使用的值是不好的。如果您想假装随机性,可以使用以下方法:
将可能的数目减少到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;
}它将循环所有可能的值,并看起来有点随机,除非他们去挖掘。一个更安全的选择是乘法组,但我已经忘记了我的数学:
发布于 2013-05-09 23:39:28
rand (参见shuffle and randomness )。rand更改为mt_randmemcached或redis,而不是MySQL总可能性
21 ^ 6 = 85,766,12185,766,121应该是可以的,要向这一代添加数据库,请尝试:
示例
$prifix = "stamp.";
$cache = new Memcache();
$cache->addserver("127.0.0.1");
$stamp = myRand(6);
while($cache->get($prifix . $stamp)) {
$stamp = myRand(6);
}
echo $stamp;所用功能
function myRand($no, $str = "", $chr = 'ACEFHJKMNPRTUVWXY4937') {
$length = strlen($chr);
while($no --) {
$str .= $chr{mt_rand(0, $length- 1)};
}
return $str;
}发布于 2013-05-09 23:36:05
您将有21 ^6码= 85 766 121 ~ 85.8百万码!
要生成所有这些内容(这需要一些时间),请查看这个问题的选定答案:algorithm that will take numbers or words and find all possible combinations。
https://stackoverflow.com/questions/16472862
复制相似问题