行政区划代码6位:生成唯一的 6位代码(6 digit codes)

我正在从以下字符生成 6 位代码。这些将用于在贴纸上盖章。
它们将以 10k 或更少的批量生成(在打印之前),并且我预计不会有超过 1-2 百万的总数(可能要少得多)。
在生成批量代码后,我将检查现有代码的 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 位数字代码)。对不起,数学不是我的强项

14

21 ^ 6 = 85766121 可能性。

使用 DB 并存储使用的值是不好的。如果你想伪造随机性,你可以使用以下内容:

减少到 19 个可能的数字,并利用 p ^ k 阶组的事实,其中 p 是一个奇素数总是循环的。

以 7 ^ 19 为一组,使用生成器 co-prime 到 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;
}

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

7

有很多可能的组合,有或没有重复,所以你的逻辑就足够了

碰撞会很频繁,因为您使用的是rand,请参阅str_shuffle and randomness

Changerandtomt_rand

检查时使用快速存储,如memcachedredis而不是 MySQL

总可能性

21 ^ 6 = 85,766,121

85,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;
}
3

正如 Baba 所说,在飞行中生成字符串将导致大量碰撞。您越接近已经生成的 80 百万个,就越难获得可用的字符串

另一种解决方案可能是生成所有可能的组合一次,并将它们存储在数据库中,一些布尔列字段标记是否已经使用行 / 令牌

然后得到其中一个

SELECT * FROM tokens WHERE tokenIsUsed = 0 ORDER BY RAND() LIMIT 0,1

然后将其标记为已使用

UPDATE tokens SET tokenIsUsed = 1 WHERE token = ...
3

您将有 21 ^ 6 个代码 = 85 766 121 〜85.8百万个代码!

要生成它们(这将需要一些时间),请查看此问题的选定答案:algorithm that will take numbers or words and find all possible combinations

本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处

(119)
公路工程竣工验收程序:LAB:州际公路编号(3.23 lab: interstate highway numbers c++)
上一篇
早c晚a眼霜:KubernetesJobInformer回调调用非常晚
下一篇

相关推荐

  • cvt变速箱结构图解:CVT变速箱的工作原理

    CVT变速箱是一种无级变速箱,它的结构由两个部分组成:输入轴和输出轴。输入轴由发动机驱动,输出轴将变速箱的输出转移到车轮上。输入轴上安装有一个可变的滑轮,它可以改变输入轴的传动比,从而改变变速箱的输出比。另外,输入轴上还安装有一个液压系统,它可以控制滑轮的位置,从而改变输入轴的传动比。…

    2023-04-02 04:00:04
    0 68 75
  • xcode代码格式化快捷键:使用Command + I快速格式化Xcode代码

    格式化的方法格式化的方法Xcode代码格式化快捷键:Option+Command+F…

    2023-07-13 12:44:06
    0 42 57
  • cv树洞柒夜事件CV树洞中的秘密与惊奇

    cv树洞柒夜事件是一个有趣的计算机视觉活动,它提供了一种新的方式来利用计算机视觉技术来探索和发现景观。它始于2020年7月,由一群热爱计算机视觉的研究者和开发者发起,他们希望通过使用机器学习技术来探索景观中的精彩之处。cv树洞柒夜事件的目标是使用机器学习技术来探索景观中的精彩之处,并利用这些发现来改善景观设计。参与者需要使用机器学习技术来探索景观,并利用这些发现来改善景观设计。参与者可以使用Python,OpenCV,TensorFlow等技术来完成任务,并将其发布在GitHub上。…

    2023-01-09 12:42:42
    0 45 31
  • win10怎么cmd打开设置:如何在Windows 10中使用CMD打开设置

    打开“开始”菜单,点击搜索框,输入cmd,然后按下回车键。在弹出的命令提示符窗口中,输入以下代码:start ms-:…

    2023-06-07 01:59:36
    0 94 52
  • win7安装cad2020:如何在Windows 7上安装AutoCAD 2020

    从官网下载CAD 2020的安装包,并双击安装文件;按照安装向导的提示,选择安装语言、安装位置和安装类型;…

    2023-09-28 00:41:59
    0 93 99
  • java protected关键字:使用protected关键字保护类成员的优点

    示例示例关键字是java中的修饰符,它可以修饰类、变量和方法。修饰类:修饰的类只能在同一个包内被访问,如果子类继承了修饰的父类,则子类可以在不同包内访问父类的成员。…

    2023-04-18 04:45:37
    0 25 10
  • codeblocks手机版下载一款强大的跨平台编程工具

    CodeBlocks是一款免费的、开源的、跨平台的C/C++ IDE,支持多种编程语言,可以用来编写、调试和编译代码。目前CodeBlocks的手机版本只支持Android系统,而且只支持C语言,不支持C++。…

    2023-06-25 04:48:50
    0 57 13
  • go和come的区别:去吧!来吧!改变你的未来

    示例示例go和come的区别:Go是一个动词,表示“去”的意思,指的是从一个地方到另一个地方的运动。Come是一个动词,表示“来”的意思,指的是从另一个地方到当前地方的运动。…

    2023-05-25 16:09:00
    0 24 75

发表评论

登录 后才能评论

评论列表(76条)