你的两个要求看起来有点矛盾。如果数组的最后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";
请澄清 - 在另一个评论,你说“我并不想创建随机值,我试图发展一种算法可以从一组信息中生成相同的值,而这些信息并不总是相等的。“这恰恰相反,“给定一些价值观,我想做一个(相当不错的)独特的结果。”,除非我完全忽略了这一点。 – 2010-12-07 06:27:48
一个好的解决方案很大程度上取决于输入数据的分布。这可能是最好的解释你试图解决的实际问题。 – jcd 2010-12-07 13:24:01