你的兩個要求看起來有點矛盾。如果數組的最後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