2011-05-04 122 views
4

我正在開發一個應用程序,它允許用戶共享一個簡單調查的鏈接。對於這一點,我想以生成針對每個測量的唯一URL,所以具有像URL:生成獨特的隨機字母數字字符串

http://myapp.com/aBcDe1F 

我希望的URL的字母數字標識符部分是僞隨機的,有點短(6-8個字符)。現在,生成這個很容易,但我如何確保它們是唯一的,但也是僞隨機的?我是否必須生成它,然後檢查數據庫的查詢以確保它之前沒有生成,如果沒有,請重新生成另一個字符串並再次嘗試相同的過程?

我知道以這種方式對URL進行模糊處理並不能真正確保安全,但基於密碼的身份驗證已被排除在此應用程序之外,所以我嘗試使用僞隨機字符串。

+0

重複創建,直到你找到一個唯一的鍵聽起來很好。 – 2011-05-04 15:38:08

+0

如果你只有6-8個字符,你必須保存在某個地方(數據庫似乎是最好的解決方案)。請記住地址中的大小寫字母不受歡迎;)根據您項目的規模和重要性,您還可以嘗試生成一些「非常可能獨特」的代碼,例如加入當前時間戳+用戶IP或隨機選擇字符,並屏蔽結果例如md5()散列(使用md5,但長度大於8個字母數字)。 – mj82 2011-05-04 15:46:51

回答

3

是 - 我認爲你必須這樣做,因爲你描述,但要完全迂腐(嗯,我的意思是「安全的」)不要做到這一點:

do 
{ 
    generate a value 
    check the database 
} 
while (the value did not exist) 

insert a new row into the db 

還有就是你可以爲兩個不同的用戶同時產生相同值的(非常)小的機會。

相反,使用值作爲數據庫中的主鍵,這樣做

do 
{ 
    generate a value 
    insert a new row into the db 
} 
while (there was a PK violation) 
0

未指定語言,但許多語言都支持創建GUID。爲什麼不使用其中之一?

+0

完全成熟的GUID可能太長以至於無法放入網址... – shoosh 2011-05-04 15:40:06

+0

我不同意。查看這個問題的URL ...''http:// stackoverflow.com/questions/5885970/generated-unique-random-alpha-numeric-strings/5886021#5886021'一個GUID會比' unique-random-alpha-numeric-strings'部分的URL。 – 2011-05-04 15:47:12

0

那麼有很多種方法可以解決這個問題,一個常見的方法是使用當前時間並在其上執行md5()。隨後,您可以檢查您的數據庫是否曾用過。通常,產生相同字符串的2 md5()結果非常接近的概率非常低。

其他方法包括使用用戶的ip + timestamp作爲字符串和md5()它。

希望它可以幫助(:

0

既然你不使用它作爲一個主要的和公正的隨機使用的字符串,你可以在Java中使用這個程序:

import java.util.Random; 

public class randomString { 

    public static void main(String args[]) { 

     Random charp = new Random(); 

     String[] chars = {"a", "b", "c", "d", "e", "f", "g", "h" ,"i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "M", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "1", "2", "3", "4", "5", "6", "7", "8", "9"}; 

     String[] word = new String[9]; 

     for(int i = 0; i < 9;i++) { 

      word[i] = chars[charp.nextInt(70)]; 
     } 

     System.out.print("Your randomly generated string is: "); 

     for(int i = 0; i < 9;i++) { 

      System.out.print(word[i]); 
     } 
    } 
} 

我知道這是一個有點低技能和許多其他圖書館和代碼如:

import java.security.SecureRandom; 
    import java.math.BigInteger; 

可以使用,但嘿,我們可以保持簡單。