1

我需要为抽奖生成大量代码,代码不应该太长,因为我们不希望用户很难在网站中输入代码,我怎么知道我的算法需要多少代码再次重复代码?以及如何生成代码?代码可以是数字也可以是字母。

4

2 回答 2

3

大写和小写字母和数字,删除容易混淆的字符,例如0, O, o, I, 1, l, 为您提供 56 个不同的字符。对于长度为 x 的代码,您可以得到 56 次可能组合的 x 次方。

四个字符给出了 9834496 种不同的组合。
七个字符给出了 1727094849536 种不同的组合。

要选择保证唯一的随机组合,您只需保留之前创建的所有组合,并对照它们检查每个新组合。

于 2012-12-16T18:36:58.953 回答
0

您可以从最大值开始,而不是从 0 开始。您首先需要确定哪些字符将构成您的列表,并使用它来创建大小为 m 的查找表。

创建一个随机素数,p。然后你使用一个从最大值开始的生成器,n = c ** m - 1,其中 c 是每个代码的字符数,那么关键是 k = n % p。然后只需将其转换为以 m 为底的数字,这将允许使用查找表来创建字符串。

然后只需生成您需要的所有代码,或者通过需要的生成器函数或一次全部生成。虽然,您希望将 n 减少 randomBetween(n / (剩余代码数)/2,n / (剩余代码数)) 或类似的东西,而不是仅仅将其减少一,这可能允许 p 和/ 或 n 只需通过蛮力确定。这也意味着您可能不应该使用最大值作为键。

只要 p 远大于所需的代码数量,只要 p 保持不变,它就不会重复。只要没有人知道 p 是什么,它也可能是密码安全的。尽管 p 可能需要保持很小以避免任何重复的机会 p 应该是实际的素数,而不是可能的素数,因此需要指数时间以上来确保 p 是素数。但是,一旦生成了密钥,生成每个密钥最坏的情况应该是多项式。尽管一次生成所需的所有密钥可能更好(如果需要,可以制作额外的密钥),存储它们,然后根据需要分发。这样您就可以确保密钥是唯一的,以防万一导致密钥生成器失败,从而强制创建 p 的第二个值,或存储 p 的原始值,

限制密钥可以使用的次数或将其归属于帐户,将有助于避免黑客只需要找到一个密钥然后分发它的问题。

于 2012-12-17T03:51:57.260 回答