行政区划代码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

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

(540)
社会代码查询全国统一:脚本定义符号代码不跳过统一 C# 中的代码
上一篇
早c晚a眼霜:KubernetesJobInformer回调调用非常晚
下一篇

相关推荐

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

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

    2023-04-02 04:00:04
    0 22 27
  • cv树洞柒夜事件CV树洞中的秘密与惊奇

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

    2023-01-09 12:42:42
    0 18 67
  • java protected关键字:使用protected关键字保护类成员的优点

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

    2023-04-18 04:45:37
    0 33 47
  • go和come的区别:去吧!来吧!改变你的未来

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

    2023-05-25 16:09:00
    0 48 52
  • cascode放大器:如何利用Cascode放大器实现高精度的信号放大

    Cascode放大器是一种由两个晶体管或三极管组成的电路,它可以提高放大器的增益,并减少其输入阻抗和输出阻抗。它的工作原理是,上游晶体管将输入信号放大,然后下游晶体管将放大的信号再次放大。这样,放大器的增益就会更大,而输入阻抗和输出阻抗也会降低。…

    2023-05-22 02:13:09
    0 73 44
  • type c是什么:如何利用Type C技术提升生产效率

    示例示例Type C 是一种新的 USB 连接器标准,它可以提供更快的数据传输速度,更高的充电速度,更小的尺寸和更好的可靠性。下面是一个使用 Type C 连接器的示例代码:…

    2023-04-06 13:21:42
    0 45 96
  • code键 A Guide to Success

    示例示例code键是一个特殊的键,它可以用来输入代码。它通常位于键盘的右上角,并且有一个特殊的图标,如“#”或“@”。下面是一个简单的代码示例,使用code键来输入代码:…

    2023-03-24 02:28:58
    0 92 75
  • cvt变速箱异响:排查CVT变速箱异响的方法

    cvt变速箱异响是指变速箱在运行时发出的异常噪音,这种异响可能是由于变速箱内部零件磨损、油质不佳或润滑不良等原因引起的。代码如下:…

    2023-02-13 07:48:44
    0 10 57

发表评论

登录 后才能评论

评论列表(28条)