首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生成唯一的6位码

生成唯一的6位码
EN

Stack Overflow用户
提问于 2013-05-09 23:31:09
回答 6查看 21.2K关注 0票数 8

我从以下字符生成一个6位数的代码。这些将被用来在贴纸上盖章。

它们将在10k或更少的批次中产生(在打印之前),我不认为会有超过120万的总数(可能更少)。

生成批代码后,我将检查现有代码的MySQL数据库,以确保没有重复代码。

代码语言:javascript
复制
// exclude problem chars: B8G6I1l0OQDS5Z2

$characters = 'ACEFHJKMNPRTUVWXY4937';

$string = '';

for ($i = 0; $i < 6; $i++) {
    $string .= $characters[rand(0, strlen($characters) - 1)];
}   

return $string;
  1. 这是生成代码的可靠方法吗?
  2. 会有多少个可能的排列?(21个字符池中的6个数字代码)。抱歉,数学不是我的强项
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-05-09 23:36:41

21^6 = 85766121种可能性。

使用DB并存储已使用的值是不好的。如果您想假装随机性,可以使用以下方法:

将可能的数目减少到19个,并利用p^k阶群(其中p是奇数素数)总是循环的事实。

以7^19的顺序组为例,使用生成器次素数为7^19 (我将选择13^11,您可以选择任何不能被7整除的东西)。

然后进行了以下工作:

代码语言:javascript
复制
$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;
}

它将循环所有可能的值,并看起来有点随机,除非他们去挖掘。一个更安全的选择是乘法组,但我已经忘记了我的数学:

票数 14
EN

Stack Overflow用户

发布于 2013-05-09 23:39:28

  • 有很多可能与重复或不重复的组合,所以你的逻辑就足够了。
  • 冲突会频繁发生,因为您使用的是rand (参见shuffle and randomness )。
  • rand更改为mt_rand
  • 在检查时使用快速存储,如memcachedredis,而不是MySQL

总可能性

代码语言:javascript
复制
21 ^ 6 = 85,766,121

85,766,121应该是可以的,要向这一代添加数据库,请尝试:

示例

代码语言:javascript
复制
$prifix = "stamp.";

$cache = new Memcache();
$cache->addserver("127.0.0.1");

$stamp = myRand(6);
while($cache->get($prifix . $stamp)) {
    $stamp = myRand(6);
}
echo $stamp;

所用功能

代码语言:javascript
复制
function myRand($no, $str = "", $chr = 'ACEFHJKMNPRTUVWXY4937') {
    $length = strlen($chr);
    while($no --) {
        $str .= $chr{mt_rand(0, $length- 1)};
    }
    return $str;
}
票数 7
EN

Stack Overflow用户

发布于 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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16472862

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档