我最近发布了这个关于用户可以在线兑换的类似礼品卡的优惠券代码的问题。我想在大键空间、低猜测性和人类可读性之间找到最佳折衷。现在我开始实施了,我意识到我遇到了另一个问题,更多的是算法挑战。
假设我采用某种代码格式——为简单起见,假设从 A 到 Z 的 10 个字符,然后我开始生成凭证。什么是正确的算法来做到这一点?!
我的第一种方法是从 0 到 308,915,776 对所有可能的代码进行编号,然后开始生成该范围内的随机数。不过,这显然有一个大问题——我必须对照所有以前生成的凭证代码检查我的随机数,如果它与现有的代码冲突,我将不得不丢弃代码并尝试另一个代码。随着系统积累更多数据,它会变慢。在只剩下一个代码的极端情况下,系统几乎不可能正确猜测它。
我可以预先生成所有代码并打乱它们,然后按顺序使用它们。但这意味着我必须存储很多代码,实际上我的密钥空间比我描述的要大,所以我们谈论的是非常大量的数据。所以这也不是太可取。
所以这让我可以按顺序使用代码。我不想要可猜测的优惠券代码。购买代金券“AAAAAAAAAY”的用户如果输入“AAAAAAAAAZ”,应该不太可能获得另一个有效代码。
我可以洗牌我的字母表和我的位置,而不是
'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 我用
'LYFZTGKBNDRAPWEOXQHVJSUMIC'
所以而不是职位
9 8 7 6 5 4 3 2 1 0 位置是
1 8 0 7 5 4 3 9 2 6
使用这个逻辑,给定代码
LNWHDTECMA
下一个代码是
LNEHDTECMA
这绝对是难以猜测的。但它们之间的距离仍然只有一个字符,并且只需其中两张凭证,您就会知道哪个位置在增加,并且您将有 90% 的机会在 24 次或更少的猜测中获得下一个代码。
我的“逃生舱”是抛弃所有这些并使用 GUID。它们的字符比我希望我的用户输入的字符多,并且包含类似的字符,例如 I/1 和 O/0,但它们神奇地使上述所有令人头疼的问题都消失了。不过,我觉得这个很有趣,也许你也是。我很想听听一些替代建议。你有什么?
谢谢!