2009-06-01 27 views
2

我有兩個函數,makeKey()和keyExists()。 ()只是生成一個5位隨機字母數字鍵,keyExists()接受這個鍵作爲唯一參數,並在表中查找,根據它是否存在返回true/false。創建一個唯一的鍵 - 最有效的方法

我需要做一些非常簡單的事情,但我無法弄清楚最快捷的方法。

我只需要製作一個關鍵字,如果它存在於表格中,再次製作一個關鍵字,等等,直到返回一個唯一的關鍵字。我認爲一個while循環就足夠了?

謝謝,請原諒基本的問題,我想我昨天在陽光下煮了我的大腦。

+0

在你有99999行之後需要一段時間。 – 2009-06-01 18:18:01

回答

5

我會使用一個do - while循環:

do { 
    $newKey = makeKey(); 
} while (keyExists($newKey)); 

這將產生對每一個新的密鑰迭代直到密鑰還不存在。

2

我的PHP是一個有點生疏,所以認爲這僞代碼:

$key_exists = true; 
while($key_exists) { 
     $key = generateKey(); 
     $key_exists = checkKey($myKeysHash, $key); 
} 
// $key is now unique and ready to use 
0

你提到一個表,所以我想知道你是否將這些密鑰存儲在數據庫中?如果是這樣,你的方法將會有一個競爭條件 - 你可能在另一個進程使用該密鑰之前檢查一個密鑰是否正確使用。

更好的方法是生成一個可能的密鑰,然後試圖保留它 - 也許通過在密鑰表上執行一個INSERT並用不同的密鑰重試直到它成功。

5

任何依賴創建的解決方案,隨着關鍵空間的填補,檢查將會有可怕的表現。您最好使用自動生成的列(身份或guid)生成唯一的密鑰。如果它需要字母數字,請使用映射功能通過選擇位組並將其用作字母表中的索引,將其轉換爲您選擇的字母表。

僞代碼

alphabet = "ABCDE...789"; 
key = insert new row, get autogenerated key 
alphaKey = ""; 
while (get n bits from key) 
    alphaKey += alphabet[bits] 
done 
echo alphaKey 
0

如果你不固定在一個5位數的號碼,你可以考慮使用你的ID的哈希+的名稱列。

0

我還假設你正在使用某種數據庫。

你不能在數據庫中使用唯一的自動增量ID列嗎?它將刪除檢查密鑰是否存在的要求,因爲數據庫引擎永遠不會分配兩次相同的ID。

但是,您必須更改應用程序中的邏輯,而不是僅編寫新功能。

0

是否需要隨機?只需增加一個變量並存儲下一個要在另一個字段中使用的變量。

0

while (keyExists($newKey = makeKey()));

可能做檢查,如果密鑰存在,它會生成一個新的最快方式。如果您在獲取新的唯一密鑰之前開始有很多衝突/需要多次檢查數據庫,那麼您可能會想要重新考慮makeKey()算法。調用數據庫代價非常高,您可以使腳本更快,更高效的調用次數更少。

相關問題