2011-05-04 125 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; 

可以使用,但嘿,我们可以保持简单。