首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >礼品卡编码算法

礼品卡编码算法
EN

Stack Overflow用户
提问于 2010-01-18 23:19:42
回答 13查看 29.6K关注 0票数 21

I recently posted this question关于用户可以在线兑换的类似礼品卡的代金券的代码。我想在较大的键空间、较低的可猜测性和人类可读性之间找到最佳的折衷。现在我进入了实现阶段,我意识到我遇到了另一个问题,更多的是算法上的挑战。

假设我采用了某种代码格式-为简单起见,假设从A到Z有10个字符,然后我开始生成凭证。执行此操作的正确算法是什么?!

我的第一种方法是对所有可能的代码进行编号,从0到308,915,776,然后开始在该范围内生成随机数。这显然有一个很大的问题-我必须检查我的随机数与之前生成的所有代金券代码,如果它与现有的代码冲突,我将不得不丢弃代码并尝试另一个代码。随着系统积累更多的数据,它会变慢。在极端情况下,当只剩下一个代码时,系统几乎不可能正确地猜测它。

我可以预先生成所有代码并对它们进行混洗,然后按顺序使用它们。但这意味着我必须存储许多代码,实际上我的密钥空间比我描述的要大,所以我们谈论的是非常大量的数据。所以这也不是很可取的。

这样我就可以按顺序使用代码了。我不想要可猜测的代金券代码。购买优惠券"AAAAAAAAAY“的用户如果键入"AAAAAAAAAZ”,应该不会有很好的机会获得另一个有效代码。

我可以改变我的字母表和位置,而不是

‘’我使用

‘'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的字符,但它们神奇地消除了上述所有令人头疼的问题。尽管如此,我很享受思考这个问题的乐趣,也许你也是。我很乐意听到一些替代的建议。你有什么发现?

谢谢!

EN

回答 13

Stack Overflow用户

回答已采纳

发布于 2010-01-18 23:33:07

两个随机生成的代码冲突的可能性基本上与用户猜测有效代码的可能性相同-并且您无法阻止用户猜测。因此,你必须有一个比实际使用的代码数量大得多的密钥空间,以至于随机冲突也是极不可能的(尽管,由于生日悖论,可能不太可能完全忽略它们,至少如果你想让你的代码相当简短),检查现有的代码并在发生冲突的情况下重新生成是一个完全可行的策略。

票数 15
EN

Stack Overflow用户

发布于 2010-01-19 01:19:41

使用N位序列号R,与连接对(R,S)的M位散列H相结合,其中S是您不发布的某个秘密“盐”S。然后以您喜欢的任何可逆方式对(R,H)进行字母数字编码。如果你喜欢MD5*或SHA这样的算法,但是位数太高,那么只需取标准散列算法的M个最低有效位即可。

你可以很容易地验证:解码字母数字编码,这样你就可以看到R和H。然后计算H‘=哈希(R+S)并验证H= H’。

编辑:R可以是递增的序列号,也可以是随机的,只要确保每个值不超过一次即可。

*在有人说"MD5坏了“之前,让我提醒你,MD5的已知弱点是碰撞攻击,而不是preimage attacks。此外,通过使用未发布的秘密盐值,您将拒绝攻击者测试您的安全机制的能力,除非他/她可以猜测盐值。如果你觉得疑神疑鬼,选择两个盐值Sprefix和Ssuffix,并计算连接的三元组(Sprefix,R,Ssuffix)的散列。

票数 10
EN

Stack Overflow用户

发布于 2010-01-18 23:27:00

一些随机数生成器有一个有趣的属性:使用正确,它们不会在很长一段时间内生成重复的数字。它们会产生一种叫做full cycle的东西。使用这里描述的算法之一,播种它,你会有许多唯一的数字,

添加一种将数字映射到字符的智能方法,您就得到了您的代码。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2086983

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档