7

我有一个系统需要一个唯一的 6 位代码来表示一个对象,我正在尝试想一个好的算法来生成它们。以下是先决条件:

  • 我使用的是 base-20 系统(没有大写字母、数字、元音或 l 以防止混淆和顽皮的词)
    • base-20 允许 6400 万种组合
  • 我将一次插入可能 5-10,000 个条目,所以理论上我会使用批量插入,这意味着使用唯一键可能不会高效或漂亮(特别是如果开始有很多冲突)
  • 填充 10% 的组合并不是不可能的,因此很有可能发生大量碰撞
  • 我想确保代码是不连续的

我有一个听起来像是可行的想法,但我的数学还不够好,无法弄清楚如何实现它:如果我从 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 百万的唯一性的散列算法可以工作,但我太愚蠢了,不知道这是否可能。

4

6 回答 6

8

您所需要的只是一个与您的密钥空间不共享任何因素的数字。最简单的值是使用素数。你可以用谷歌搜索大素数,或使用http://primes.utm.edu/lists/small/10000.txt

于 2009-08-10T23:48:17.700 回答
1

还有另一种方法可以获得类似的结果(跳过整个值集而不重复,非连续地),不使用素数 - 通过使用最大长度序列,您可以使用特殊构造的移位寄存器生成。

于 2009-08-11T00:21:09.810 回答
1

任何不是序列长度因素的素数都应该能够跨越序列而不重复。对于 64000000,这意味着您不应该使用 2 或 5。当然,如果您不希望它们连续生成,那么分开 2 或 5 生成它们可能也不是很好。我个人喜欢73973这个数字!

于 2009-08-10T23:50:35.573 回答
0

我的数学有点生疏,但我认为您只需要确保 N 和 6400 万的 GCF 为 1。不过,我会选择一个素数(不会平均分为 6400 万)以防万一。

于 2009-08-10T23:50:02.593 回答
0

@尼克刘易斯:

好吧,前提是质数不整除 6400 万。因此,出于提问者的目的,可能不建议使用 2 或 5 之类的数字。

于 2009-08-10T23:52:02.340 回答
-3

不要重新发明轮子: http ://en.wikipedia.org/wiki/Universally_Unique_Identifier

于 2009-08-10T23:51:30.483 回答