我有兩個函數,makeKey()和keyExists()。 ()只是生成一個5位隨機字母數字鍵,keyExists()接受這個鍵作爲唯一參數,並在表中查找,根據它是否存在返回true/false。創建一個唯一的鍵 - 最有效的方法
我需要做一些非常簡單的事情,但我無法弄清楚最快捷的方法。
我只需要製作一個關鍵字,如果它存在於表格中,再次製作一個關鍵字,等等,直到返回一個唯一的關鍵字。我認爲一個while循環就足夠了?
謝謝,請原諒基本的問題,我想我昨天在陽光下煮了我的大腦。
我有兩個函數,makeKey()和keyExists()。 ()只是生成一個5位隨機字母數字鍵,keyExists()接受這個鍵作爲唯一參數,並在表中查找,根據它是否存在返回true/false。創建一個唯一的鍵 - 最有效的方法
我需要做一些非常簡單的事情,但我無法弄清楚最快捷的方法。
我只需要製作一個關鍵字,如果它存在於表格中,再次製作一個關鍵字,等等,直到返回一個唯一的關鍵字。我認爲一個while循環就足夠了?
謝謝,請原諒基本的問題,我想我昨天在陽光下煮了我的大腦。
我會使用一個do
- while
循環:
do {
$newKey = makeKey();
} while (keyExists($newKey));
這將產生對每一個新的密鑰迭代直到密鑰還不存在。
我的PHP是一個有點生疏,所以認爲這僞代碼:
$key_exists = true;
while($key_exists) {
$key = generateKey();
$key_exists = checkKey($myKeysHash, $key);
}
// $key is now unique and ready to use
你提到一個表,所以我想知道你是否將這些密鑰存儲在數據庫中?如果是這樣,你的方法將會有一個競爭條件 - 你可能在另一個進程使用該密鑰之前檢查一個密鑰是否正確使用。
更好的方法是生成一個可能的密鑰,然後試圖保留它 - 也許通過在密鑰表上執行一個INSERT並用不同的密鑰重試直到它成功。
任何依賴創建的解決方案,隨着關鍵空間的填補,檢查將會有可怕的表現。您最好使用自動生成的列(身份或guid)生成唯一的密鑰。如果它需要字母數字,請使用映射功能通過選擇位組並將其用作字母表中的索引,將其轉換爲您選擇的字母表。
僞代碼
alphabet = "ABCDE...789";
key = insert new row, get autogenerated key
alphaKey = "";
while (get n bits from key)
alphaKey += alphabet[bits]
done
echo alphaKey
如果你不固定在一個5位數的號碼,你可以考慮使用你的ID的哈希+的名稱列。
爲什麼不使用內置的PHP函數,如uniqid()?
我還假設你正在使用某種數據庫。
你不能在數據庫中使用唯一的自動增量ID列嗎?它將刪除檢查密鑰是否存在的要求,因爲數據庫引擎永遠不會分配兩次相同的ID。
但是,您必須更改應用程序中的邏輯,而不是僅編寫新功能。
是否需要隨機?只需增加一個變量並存儲下一個要在另一個字段中使用的變量。
while (keyExists($newKey = makeKey()));
可能做檢查,如果密鑰存在,它會生成一個新的最快方式。如果您在獲取新的唯一密鑰之前開始有很多衝突/需要多次檢查數據庫,那麼您可能會想要重新考慮makeKey()算法。調用數據庫代價非常高,您可以使腳本更快,更高效的調用次數更少。
在你有99999行之後需要一段時間。 – 2009-06-01 18:18:01