我想生成 16 位十六进制序列号,例如:F204-8BE2-17A2-CFF3。
(这个模式给了我 16^16 个不同的序列号,但我不需要所有的)
我需要大家给我一个算法来生成这些序列号随机具有一个特殊的特征是: 每两个序列号有(至少)6 个不同的数字
(=意思是如果给你两个最相似的序列号,它们在6个指标上应该还是有区别的)
我知 Prop 有此特性的好的算法需要记住以前生成的序列号,但我不想那么多。
事实上,我需要一种算法,它能以最小的概率让所选对发生碰撞(小于 0.001 似乎就足够了)
附言:
我刚刚尝试使用 MD5 哈希随机创建 10K 字符串,它以 0.00018 的概率给出了相似的字符串(相似=超过 3 个相同的数字)。
最佳答案
无需记住所有先前生成的代码就可以构建正确的生成器。您可以使用 Hamming code 生成间隔 6 个字符的序列号。 .汉明码可以设计为任意分隔两个不同的生成值。显然,距离越大,您必须使用的冗余度就越高,从而导致代码越复杂,数字越长。
首先,您可以根据自己的喜好设计汉明码,将数字编码为十六进制数字序列,然后您可以采用任何数字序列并将其用作种子,例如质数。您只需要始终记住,上次使用的是哪个号码并使用下一个。
话虽这么说,如果您不需要适本地确保两个连续剧的最小距离,并且会接受一个小错误,我建议任何一半体面的哈希函数或密码应该产生适当间隔的输出。因此,我要做的第一件事就是取MD5。或 SHA哈希并在数字 1 - 1000 上进行测试。我希望结果会非常令人满意。
关于algorithm - 需要一个算法来生成序列号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21835678/