如何生成6300万个奖品代码

Sha*_*sri 17 php

我试图想出一种"智能"和"安全"的方式来生成大约6300万个独特的代码用于比赛.代码长度约为10个字符.

有没有人做过类似的事情或意识到这个问题可能产生的任何"障碍"?我们如何最大限度地降低某人猜测代码的可能性?

这个项目将在PHP中完成,但这并不重要,更多的逻辑是这里的问题.

任何反馈都会非常感激.

更新 只是为了澄清它将是10个字符的不区分大小写的字母数字值.A-Z0-9

MSa*_*ers 31

语法:

您可能会让人们复制这些代码,这意味着这些代码应该易于复制.Gamecat指出,10 ^ 10太小了.kgiannakakis有一个更好的主意,但这会导致另一个问题:"1"看起来很像"我"."0","C","O"和"Q"也非常相似.这不是一个大问题.定义一个安全的alfabet:"0123456789ABDEFGHJKLMNPRSTUVXYZ"(省略COIQ)从评论:根据你选择的字体,5/S和U/V也可能在视觉上不明确; 根据需要更换.这是一个32符号(5位)代码.10个字符的代码是50位数.这些应该是相当简单的生成,排序,复制,比较等.被猜测的机会大约是0.63E-7

由于代码太长而无法记住,因此用户在复制时需要一个静止点.因此,将字符串拆分为两个或三个部分,并确保输入字段与此细分匹配.

例如,AKG3L-45TEE =>两组5,即使你不记得5个字符,也很容易找到你停止阅读的地方.


如何生成它们:

这很简单.您不需要特别复杂的算法来生成候选者.您可以为每个代码生成10个随机数,从每个数字中取5位(通常中间位最好,例如(rand()/ 64)模32).使用此值[0-31]作为字母表的索引.使用此字符串作为主键创建数据库表,并插入直到该表具有6300万个条目.您可能希望在此表中添加"生成日期"和"已兑换日期"日期.

  • +1删除令人困惑的值的好点 (9认同)
  • 字母ess'S'和数字5'5'也是同态的. (4认同)
  • 相似字符集在很大程度上取决于字体,在某些字体中U和V也很难区分.我还会牺牲代码空间的符号来进行错误检测,因此您可以通知用户他可能错误地输入了代码.如果使用一些微不足道的节流,这仍然留有足够的空间让猜测变得不可行. (2认同)

Too*_*the 10

如果我理解正确,你想要创建63个数字10位数的代码,这些代码具有较低的"猜测因子".

有10,000,000,000个有效组合.其中63,000,000是价格数字.63/10,000 = 0.0063.所以每次猜测都有0.63%的成功率.听起来不高,但是用蛮力,数字很容易获得.

你确定64比10000的比例足够好吗?

  • 不使用十进制数字的好理由; 见kgiannakakis (2认同)

tva*_*son 5

在0 - 2 50 -1 范围内生成一组真正随机,唯一的64位数字.你需要跟踪你所看到的并拒绝重复.从32个字母的字母表中使用此数字的低50位中的每个5位 - 基本上所有英文字母(大写或小写)中的字母减去L和O加上数字2-9(这减少了l之间的混淆)/1和0/O).对于6300万个代码,这将为您提供0.000006%的随机选择有效代码序列的概率(63,000,000/2 50).

我还使用自动生成的主键(int)和使用32位随机值进行位交错来完成此操作.在这种情况下,我使用完整的64位从字母表生成13个字符,并在固定位置添加两个随机字符,用于15个字符的代码.在兑换代码时,您反转算法以提取密钥和随机性,丢弃两个额外的随机字符,然后将随机性与存储的密钥进行比较以验证代码.