2010-12-06 33 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