gpt4 book ai didi

php - 从整数生成伪随机 6 字符字符串

转载 作者:可可西里 更新时间:2023-11-01 12:35:35 26 4
gpt4 key购买 nike

我正在尝试通过 PHP 解决以下问题。目的是基于整数种子生成一个唯一的 6 字符字符串,并包含预定义的字符范围。第二个要求是字符串必须随机出现(因此如果代码 1 为 100000,则代码 2 为 100001,代码 3 为 100002 是 Not Acceptable )

字符范围是:

  • 大写字母 A-Z,不包括:B、I、O、S 和 Z
  • 0-9 不包括:0、1、2、5、8

如果我没记错的话,总共有 26 个字符。我的第一个想法是从数字 7962624 开始从 10 进制编码到 24 进制。7962624 + seed 也是如此,然后 base24 编码该数字。

这给了我字符 0-N。如果我以下列方式替换生成的字符串,那么我满足第一个条件:

B=P, I=Q, 0=R, 1=T, 2=U, 5=V, 8=W

所以此时,我的代码将如下所示:

1=TRRRR, 2=TRRRT, 3=TRRRU

所以我想问各位大师的问题是:我如何制作一个行为一致的方法(因此给定整数的返回字符串始终相同)并满足上述 2 个要求? 我已经在这上面花了整整 2 天时间,还没有将 700,000,000 条代码转储到数据库中并随机检索它们,我完全没有想法。

斯蒂芬

最佳答案

如果您采用输入序列 1,2,3... 并应用对质数取模的线性映射,您会得到一个看起来相当随机的序列。唯一代码的数量限于质数,因此您应该选择一个大的。只要您选择一个不能被质数整除的乘数,生成的代码将是唯一的。

这是一个示例:使用 6 个字符,您可以生成 266=308915776 个唯一字符串,因此合适的质数可以是 308915753。因此,此函数将生成超过 300.000.000 个唯一代码:

function encode($num) {
$scrambled = (240049382*$num + 37043083) % 308915753;
return base_convert($scrambled, 10, 26);
}

确保你在 64 位 PHP 上运行它,否则乘法会溢出。在 32 位上,您必须使用 bcmath。为数字 1 到 9 生成的代码是:

n89a2d
hdh4jo
biopb9
5o6k2k
3eek5
k8m9aj
ee4424
8jbojf
2ojjb0

剩下的就是填充有时会丢失的初始 0 并替换字母和数字,这样就不会产生任何禁止的字符。

如您所见,没有明显的模式,但是有时间、有足够动力并且可以访问其中一些代码的人将能够找出正在发生的事情。更安全的替代方法是使用 block 大小较小的加密算法,例如 Skip32 .

关于php - 从整数生成伪随机 6 字符字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19161611/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com