2011-05-21 73 views
0

我在互聯網上有人發佈圖片和短字符串的服務生成。只有一個可以使用。但是,我正在進入數據庫中的重複內容,並且看到重大問題。隨機字符串重複嗎?

下面是我在用的:

$id=rand(10000,99999); 
$short_string = base_convert($id,20,36); 

什麼是解決它的最好方法?從數據庫中檢查並保持循環,直到它不匹配?如果每一種可能的解決方案都會陷入無限循環呢?

+0

通過您發佈的代碼,您只能擁有89999個數字串ID。不是很多。這些是否永久使用?還是你記得並回收它們? – 2011-05-21 02:24:42

+1

問題:base_convert(string $ number,int $ frombase,int $ tobase)。我可能會錯過一些東西,但不是你的基地,基地10而不是20? – 2011-05-21 02:42:28

+0

@Mitch小麥:這正是我使用的代碼。將基數從10變爲20是做什麼的? – iosfreak 2011-05-21 02:56:01

回答

1

將最後一個值增加一個隨機數,而不是使用隨機值。像這樣:

$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

+0

這就是我所做的。除了我添加了10個隨機數字。我認爲它不會很快重複。 – iosfreak 2011-05-21 03:03:35

0

使用md5 http://php.net/manual/en/function.md5.php 生成的字符串沒有衝突(很可能)。

+0

它需要是URL友好的。 1-6個字符長。 – iosfreak 2011-05-21 01:41:35

+0

您可以爲第一部分用戶urlEncode,但我不確定是否有強健的只有6個字符。 – 2011-05-21 01:42:54

+0

下面是一個示例URL:http://myflashpics.com/picture/8292 ...我不能有20-40個字符的字符串。 – iosfreak 2011-05-21 01:42:57

1

把你的PK通過一個算法,從它產生一個唯一的數字,並把它通過你的函數。

+0

鏈接?示例代碼?謝謝... – iosfreak 2011-05-21 01:46:17

+0

我確實有每個圖像的ID。那麼我能做些什麼嗎?就像生成一些像md5一樣特殊的東西,但真的很短。我可能會使用錯誤的詞彙,但你知道我的意思。請記住:我需要儘可能保持簡短。 – iosfreak 2011-05-21 01:47:49

+0

將它填零,例如8位數字,反轉數字,將其轉換回數字,然後將其轉換。 – 2011-05-21 01:49:46

1

最好的辦法是在寫入一個包含該數字的新圖像之前,通過在圖像列表中使用隨機數生成器來確保圖像不存在。

嘗試使用使用數字,字母的算法來增加字符的數量和類型,以增加可以使用的組合。

+0

但是,這是否仍然存在多次獲得相同結果的風險? – iosfreak 2011-05-21 01:49:08

+0

如果你真的想永遠不會有重複的數字,你可以按照數字的增加而不是隨機數的順序來計數,但如果你選擇隨機的方式,總會有一個偶然的機會。 – BRampersad 2011-05-21 02:34:59

+0

這可能會引入競爭條件,如果兩個進程競相插入相同的值;兩次檢查都可以成功。 – MarkR 2011-05-21 06:22:32