2013-08-31 75 views
0

在編寫我的應用程序時,我想爲我的數據庫中的某些實體提供隨機標記,例如ABCD。這些總是四個字符,可以包含大寫字母和數字。使隨機字符串不在數據庫中

問題是,如何分配它們?我們絕不會用160萬點的可能性,這提供,但隨着數據庫變得更加飽滿,在「尋求」的時間,用通過這種L4僞碼隨機字符串得到成倍長:

function makeUniqueKey() { 
    while (true) { 
     $key = strtoupper(str_random(4)); 
     if (!DB::table('items')->where('key', '=', $key)->count()) { 
      return $key; 
     } 
    } 
} 

我想這是更多的是強迫症的好奇心問題,但是爲了創建數據庫中的項目的隨機唯一鍵,非指數算法有沒有什麼巧妙的技巧?

+0

'while'循環最終會變成無限長,並帶有4個字符的隨機字符串。只有這麼多組合。 –

+0

是的,執行時間將接近無窮大,因爲表中的條目數量爲'(字符)^(字符串長度)' –

回答

1

最好不要隨機分配它們。最簡單的是漸進的,(例如:從aaaa開始,一直到ZZZZ)。

無論我將這個字符串映射到一個數字。 aaaa = 1ZZZZ = 52^4

然後,您可以選擇一個隨機數,然後在數據庫中搜索第一個間隔。應該可以使用存儲過程。這應該會使性能至少降低線性,而不會隨着數據集的增加而呈指數增長。

+0

嗯,這是一個有趣的解決方案,絕對值得考慮。 –