Tinyurl风格的独特代码:防止冲突的潜在算法

时间:2009-08-10 23:44:14

标签: algorithm language-agnostic math puzzle hash-code-uniqueness

我有一个系统,需要一个唯一的6位数代码来表示一个对象,我正在考虑一个很好的算法来生成它们。以下是预先要求:

  • 我正在使用base-20系统(没有大写字母,数字,元音或l来防止混淆和顽皮的话)
    • base-20允许6400万种组合
  • 我将一次插入5-10万个条目,所以理论上我会使用批量插入,这意味着使用一个唯一的密钥可能效率不高或不漂亮(特别是如果开始发生大量冲突)
  • 填补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百万的唯一性的哈希算法可以工作,但我太愚蠢了,不知道这是否可行。

6 个答案:

答案 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)