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

4

我正在开发一个应用程序,允许用户分享一个简单调查的链接。为此,我希望为每个调查生成唯一的URL,因此需要一个像这样的URL:

http://myapp.com/aBcDe1F

我希望URL的字母数字标识符部分是伪随机且较短(6-8个字符)。现在,生成它很容易,但如何确保它们既唯一又伪随机?我需要生成它,然后查询数据库以确保之前没有生成过,如果没有,则再次生成另一个字符串并尝试相同的过程吗?
我知道通过这种方式混淆URL并不能真正确保安全性,但基于密码的身份验证对于此应用程序是被排除的,因此我试图使用伪随机字符串。

我认为重复创建直到找到唯一键是可行的。 - Ash Burlaczenko
如果您只有6-8个字符,您必须将其存储在某个地方(数据库似乎是最佳解决方案)。只需记住地址中的大小写字母不受欢迎即可;) 根据项目的规模和重要性,您还可以尝试生成一些“非常可能独特”的代码,例如当前时间戳+用户IP或随机验证码,并掩盖结果,例如md5()哈希(但使用md5时长度> 8个字母数字)。 - mj82
4个回答

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。为什么不使用其中之一呢?


我不同意。看看这个问题的URL... https://dev59.com/mVbUa4cB1Zd3GeqPCdhL#5886021 一个GUID比URL中的generating-unique-random-alpha-numeric-strings部分更短. - Richard Brightwell

0

有很多方法可以实现,其中一种常见的方法是使用当前时间并对其进行md5()。随后,您可以检查您的数据库是否曾经使用过该方法。通常情况下,产生相同字符串结果的2个md5()的概率非常低。

其他方法包括使用用户的IP + 时间戳作为字符串并对其进行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;

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接