我想生成16位数字的十六进制序列号,比如: F204-8BE2-17A2-CFF3。
(这个模式给我16^16不同的序列号,但我不需要所有的序列号)
我需要你们都建议我一种算法来生成这些序列号随机有一个特殊的特征:每两个序列号都有(至少)6个不同的数字。
(=这意味着如果给出两个最相似的序列号,它们在6个索引上仍有差异)
我知道有这个特性的好算法需要记住以前生成的序列号,我不想要那么多。
实际上,我需要一种算法,以最小的概率使所选的对发生碰撞(小于0.001似乎就足够了)。
PS:
我刚刚尝试使用MD5哈希随机创建10K字符串,它给出了类似的字符串( similar=more大于3个相同的数字),概率为0.00018。
发布于 2014-02-17 18:14:17
不需要记住以前生成的所有代码,就可以构造正确的生成器。您可以使用汉明码生成间隔为6个字符的序列号。汉明码可以设计成任意划分两个不同的生成值。显然,距离越远,需要使用的冗余就越高,导致代码更复杂,数字更长。
首先您设计一个您喜欢的hamming代码,它将一个数字编码成一个十六进制数字序列,然后您可以获取任何数字序列并将其用作种子,例如素数。你只需要记住,最后用的是什么号码,用的是下一个号码。
尽管如此,如果您不需要适当地确保两个序列的最小距离,并满足于一个小的错误,我建议任何半体面的散列函数或密码应该产生适当的间隔输出。因此,我要做的第一件事就是取MD5或沙盒散列,并在数字1-1000上测试它们。我的希望是,结果会相当令人满意。
发布于 2014-02-17 22:07:43
我建议您查看ANSI X9.17伪随机位生成器。在这些幻灯片中给出了算法草图。ANSI X9.17生成64位伪随机字符串,这正是您想要的。
NIST批准了该生成器的修订版和增强型。请看一下这个页面。
现在,无论您使用ANSI X9.17生成器,还是开发自己的生成器,最好让生成器通过一些统计测试,以确保其伪随机位的质量。
示例测试包括ENT电池、硬质电池和NIST电池。
https://stackoverflow.com/questions/21835678
复制相似问题