2010-12-06 32 views
1

给定一些值,我想做一个(相当不错的)独特的结果。从容错的多个值生成唯一ID

$unique1 = generate(array('ab034', '981kja7261', '381jkfa0', 'vzcvqdx2993883i3ifja8', '0plnmjfys')); 
//now $unique1 == "sqef3452y"; 

我还需要东西是相当接近返回相同的结果。在这种情况下,有20%的值缺失。

$unique2 = generate(array('ab034', '981kja7261', '381jkfa0', 'vzcvqdx2993883i3ifja8')); 
//also $unique2 == "sqef3452y"; 

我不知道从这样的算法开始,但我有一些假设。

  1. 我假定给出的更多的值,更准确所得ID - 换句话说,用20个值优于5.
  2. 我还假设一个置信因子,可以计算和调整。

什么是最好的权重因素,可以说'价值1比价值3更重要'。这将需要一个多维数组来输入而不是一维。

我刚刚在键盘上查找了这些值,但实际上他们可能是短或长的字母数字值。

+0

请澄清 - 在另一个评论,你说“我并不想创建随机值,我试图发展一种算法可以从一组信息中生成相同的值,而这些信息并不总是相等的。“这恰恰相反,“给定一些价值观,我想做一个(相当不错的)独特的结果。”,除非我完全忽略了这一点。 – 2010-12-07 06:27:48

+0

一个好的解决方案很大程度上取决于输入数据的分布。这可能是最好的解释你试图解决的实际问题。 – jcd 2010-12-07 13:24:01

回答

1

你的两个要求看起来有点矛盾。如果数组的最后20%是不重要的(即,如果它相同的结果'0plnmjfys'或它是null),那么为什么要将它包括在第一位呢?

第一步是澄清你想消除歧义。如果它不重要,就放弃它。

一旦你决定了这一点,你必须问自己,如果你期望两个“关闭”结果有“关闭”的ID ...即也许你想

$unique1 = generate(array('ab034', '981kja7261', '381jkfa0', 'vzcvqdx2993883i3ifja8', '0plnmjfys')); 
//now $unique1 == "sqef3452y"; 

$unique1 = generate(array('ab034', '981kja7261', '381jkfa0', 'vzcvqdx2993883i3ifja8', '0plSsa45')); 
//now $unique1 == "sqef3452k"; 

后者是棘手的,因为最独特的ID发生器采用hashes(你可能想看看这些了,太)这样两个非常相似的字符串可以返回完全不同的结果。

如果要确保唯一性并且不在意在结果中具有“紧密度”,只需计算连接字符串的散列值或每个输入字符串的散列值并连接散列码。

如果你想特权“亲密度”,你可以计算最相关部分的散列值,并为其余不太相关的部分应用Soundex algorithm或类似的东西。

只要记住你在这方面有相互冲突的要求:即使唯一的区别是1000字符串中的一个字符,唯一ID也很难给出(非常不同的)字符串代码。

贴近(该字符串是“或多或少相同的”,因为这第二个字符串)尝试做完全相反的,并且有希望返回相同的代码为2:引用约Soundex算法维基百科:

使用此算法,“Robert” 和“Rupert”返回相同的字符串 “R163”,而“Rubin”产生“R150”。 “Ashcraft”和“Ashcroft”均产量为 “A261”。

那么......哪个是哪个?你认为使用哈希前4个元素(在你的例子中)和Soundex在你的示例工作中最不重要的20%?

这可能会导致(又回到了你的例子)中是这样的:。

$unique2 = generate(array('ab034', '981kja7261', '381jkfa0', 'vzcvqdx2993883i3ifja8',)); 
//now $unique2 == "AB67R45-000000"; 

$unique1 = generate(array('ab034', '981kja7261', '381jkfa0', 'vzcvqdx2993883i3ifja8', '0plSsa45')); 
//now $unique2 == "AB67R45-012000"; 
0

我建议你阅读随机数发生器(RNG),种子和随机程度。

通常,大多数软件RNG使用称为'种子'的值来初始化算法。之后,所产生的每个随机数被用作下一次迭代的种子。这意味着如果您总是使用相同的种子(例如1或42),您将始终获得相同的“随机”数字序列。因此,这些类型的RNG通常被认为是“伪随机”。出于安全考虑,通常使用类似当前系统时间(以毫秒为单位)或硬件随机化设备来选择种子的值,以便减少在任何合理时间段内两次选取相同种子的机会。

你似乎提出的是一个RNG,它可以采用多个字符串,可能带有权重,并使用一些公式来计算种子。然后,你使用你的种子RNG随机选择字符来创建一个新的字符串。这很有趣,但不幸的是,它不会像上面描述的那样只是从数字种子和现有的RNG开始,而是真正意义上更加随机。虽然可能会很有趣!

http://en.wikipedia.org/wiki/Random_number_generation

你可能也是谷歌“随机串生成”或一些这样的发现创造的随机字符串更多的资源。

+0

我不想创建随机值。我试图开发一种算法,可以从一组并不总是相等的信息中生成相同的值。 – ojreadmore 2010-12-06 17:31:06