我需要为抽奖生成大量代码,代码不应该太长,因为我们不希望用户很难在网站中输入代码,我怎么知道需要多少代码我的算法再次重复一次代码?我怎么能生成代码?代码可以是数字和字母。
答案 0 :(得分:3)
Uppsercase和lowerase字母和数字,删除容易混淆的字母和数字,例如0
,O
,o
,I
,1
,{{1 ,给你56个不同的字符。对于长度为x的代码,您可以得到56个x可能组合的幂。
四个字符给出了9834496种不同的组合 七个字符给出了1727094849536种不同的组合。
要选择保证唯一的随机组合,您只需保留您创建的所有先前组合,并针对它们检查每个新组合。
答案 1 :(得分:0)
不是从0开始,而是从最大值开始。您首先需要确定列表中包含哪些字符,然后使用它来创建大小为m的查找表。
创建一个随机素数,p。然后你使用一个从最大值开始的生成器,n = c ** m - 1,其中c是每个代码的字符数,然后键是,k = n%p。然后将其转换为基数为m的数字,这将允许使用查找表来创建字符串。
然后只需生成所需的所有代码,或者根据需要生成所有代码,或者一次生成所有代码。虽然,你想要通过randomBetween(n /(剩余代码数)/ 2,n /(剩余代码数))或类似的东西减少n,而不是仅减少1,这可能允许p和/或n只是通过蛮力来确定。这也意味着您可能不应该使用最大值作为密钥。
只要p远大于所需的代码数量,只要p保持不变,它就不会重复。只要没有人知道p是什么,它也可以是加密安全的。尽管p可能需要保持较小以避免任何重复的可能性,但p应该是实际的素数,而不是可能的素数,因此需要超过指数时间以确保p为素数。一旦生成了密钥,生成每个密钥最好是多项式。虽然最好只生成您需要的所有密钥(如果需要,可以添加额外的密钥),存储它们,然后根据需要进行分发。这样你可以确定键是唯一的,如果某些东西导致键生成器失败,从而强制创建p的第二个值,或者存储p的原始值,使得p的值更有可能变为已知,如果您没有存储实际有效密钥,则需要存储p(以及n)。
限制密钥可以使用的次数或将其归因于帐户,有助于避免黑客只需找到一个密钥然后分发密钥的问题。