我在互聯網上有人發佈圖片和短字符串的服務生成。只有一個可以使用。但是,我正在進入數據庫中的重複內容,並且看到重大問題。隨機字符串重複嗎?
下面是我在用的:
$id=rand(10000,99999);
$short_string = base_convert($id,20,36);
什麼是解決它的最好方法?從數據庫中檢查並保持循環,直到它不匹配?如果每一種可能的解決方案都會陷入無限循環呢?
我在互聯網上有人發佈圖片和短字符串的服務生成。只有一個可以使用。但是,我正在進入數據庫中的重複內容,並且看到重大問題。隨機字符串重複嗎?
下面是我在用的:
$id=rand(10000,99999);
$short_string = base_convert($id,20,36);
什麼是解決它的最好方法?從數據庫中檢查並保持循環,直到它不匹配?如果每一種可能的解決方案都會陷入無限循環呢?
將最後一個值增加一個隨機數,而不是使用隨機值。像這樣:
$results = mysql_query("SELECT * FROM thetable ORDER BY theId DESC LIMIT 1");
$keyToUse = 1;
if($row = mysql_fetch_array($results)) {
$keyToUse = (int)$row['theId'] + rand(1, 100);
}
的整數鍵,然後轉換,並從任何格式,使用說base_convert
。
這就是我所做的。除了我添加了10個隨機數字。我認爲它不會很快重複。 – iosfreak 2011-05-21 03:03:35
使用md5 http://php.net/manual/en/function.md5.php 生成的字符串沒有衝突(很可能)。
最好的辦法是在寫入一個包含該數字的新圖像之前,通過在圖像列表中使用隨機數生成器來確保圖像不存在。
嘗試使用使用數字,字母的算法來增加字符的數量和類型,以增加可以使用的組合。
但是,這是否仍然存在多次獲得相同結果的風險? – iosfreak 2011-05-21 01:49:08
如果你真的想永遠不會有重複的數字,你可以按照數字的增加而不是隨機數的順序來計數,但如果你選擇隨機的方式,總會有一個偶然的機會。 – BRampersad 2011-05-21 02:34:59
這可能會引入競爭條件,如果兩個進程競相插入相同的值;兩次檢查都可以成功。 – MarkR 2011-05-21 06:22:32
你試過用mt_rand()
http://www.php.net/manual/en/function.mt-rand.php。你也應該增加範圍。
通過您發佈的代碼,您只能擁有89999個數字串ID。不是很多。這些是否永久使用?還是你記得並回收它們? – 2011-05-21 02:24:42
問題:base_convert(string $ number,int $ frombase,int $ tobase)。我可能會錯過一些東西,但不是你的基地,基地10而不是20? – 2011-05-21 02:42:28
@Mitch小麥:這正是我使用的代碼。將基數從10變爲20是做什麼的? – iosfreak 2011-05-21 02:56:01