我有一个系统,需要一个唯一的6位数代码来表示一个对象,我正在考虑一个很好的算法来生成它们。以下是预先要求:
我有一个想法听起来像它会工作,但我在数学方面不够好,无法弄清楚如何实现它:如果我从0开始并增加N,然后转换为base-20,它似乎就像N应该有一些值,让我可以在重复任何值之前计算0-63,999,999中的每个值。
例如,使用N = 3(所以10 mod 3)从0到9:0,3,6,9,2,5,8,1,4,7。
是否有一些神奇的数学方法可以计算出一些较大数字的N值,这些数值能够计算整个范围而不重复?理想情况下,我选择的数字会在集合周围跳跃,这样就不会有明显的模式,但我不确定它是多么可能。
或者,一个保证0-64百万的唯一性的哈希算法可以工作,但我太愚蠢了,不知道这是否可行。
答案 0 :(得分:8)
您需要的只是一个与您的密钥空间不共享的数字。最简单的价值是使用素数。您可以谷歌获取大素数,或使用http://primes.utm.edu/lists/small/10000.txt
答案 1 :(得分:1)
任何不是序列长度因子的素数应该能够跨越序列而不重复。对于64000000,这意味着你不应该使用2或5.当然,如果你不希望它们连续生成,那么相隔2或5生成它们可能也不是很好。我个人喜欢73973号!
答案 2 :(得分:1)
还有另一种方法可以获得类似的结果(跳过整个值集而不重复,不相应地),而不使用素数 - 使用maximum length sequences,您可以使用特殊构造的移位寄存器生成。
答案 3 :(得分:0)
我的数学有点生疏,但我认为你只需要确保N和6400万的GCF是1.我会选择素数(不能均匀分配到6400万)但是。
答案 4 :(得分:0)
@Nick Lewis:
嗯,只有素数不分6400万。因此,对于提问者的目的,像2或5这样的数字可能是不可取的。
答案 5 :(得分:-3)