• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

[复制链接]
菜鸟教程小白 发表于 2022-12-5 23:05:06 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

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

字符范围为:

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

如果我没记错的话,总共有 26 个字符。我的第一个想法是从编号 7962624 开始从 base 10 编码到 base 24。7962624 + 种子也是如此,然后 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 个代码转储到数据库中并随机检索它们,我完全没有想法。

斯蒂芬



Best Answer-推荐答案


如果您将输入序列 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,并替换字母和数字,这样就不会产生任何禁止的字符。

如您所见,没有明显的模式,但如果有人有时间、有足够的动力并可以访问其中的一些代码,就能够找出发生了什么。更安全的替代方法是使用具有小块大小的加密算法,例如 Skip32 .

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

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap