生成唯一的随机字母数字字符串

时间:2011-05-04 15:33:47

标签: random alphanumeric

我正在开发一个应用程序,允许用户共享一个简单调查的链接。为此,我想为每个调查生成唯一的网址,因此请使用以下网址:

http://myapp.com/aBcDe1F

我希望URL的字母数字标识符部分是伪随机的,有点短(6-8个字符)。现在,生成这很容易,但我如何确保它们是唯一的但也是伪随机的?我是否必须生成它,然后检查数据库以确保它之前没有生成,如果没有,重新生成另一个字符串并再次尝试相同的过程?

我知道以这种方式混淆URL并不能真正确保安全性,但是这个应用程序排除了基于密码的身份验证,因此我尝试使用伪随机字符串。

4 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

未指定语言,但许多语言支持创建GUID。为什么不使用其中之一?

答案 2 :(得分:0)

有很多方法可以解决它,一个常见的方法是使用当前时间并在其上执行md5()。随后,如果以前使用过,您可以检查数据库。通常,产生相同串的2 md5()导致紧密接近的概率非常低。

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

希望它有所帮助(:

答案 3 :(得分: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;

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