【问题标题】:Generating unique, random alpha numeric strings生成唯一的随机字母数字字符串
【发布时间】:2011-08-18 15:54:15
【问题描述】:

我正在开发一个应用程序,它允许用户共享一个简单调查的链接。为此,我想为每个调查生成唯一的 URL,因此具有如下 URL:

http://myapp.com/aBcDe1F

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

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

【问题讨论】:

  • 重复创建直到找到唯一的键对我来说听起来不错。
  • 如果你只有 6 个 -8 个字符,你必须把它保存在某个地方(数据库似乎是最好的解决方案)。请记住,地址中的大小写字母不受欢迎;)根据项目的规模和重要性 - 您还可以尝试生成一些“非常可能唯一”的代码,例如加入当前时间戳 + 用户 IP 或随机 chapcha,并屏蔽结果,例如md5() 哈希(使用 md5,但长度 > 8 个字母数字)。

标签: random alphanumeric


【解决方案1】:

由于您没有将其用作键,而只是用于随机使用字符串,因此您可以在 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;

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

【讨论】:

    【解决方案2】:

    是的 - 我认为你必须按照你的描述去做。但要完全迂腐(嗯,我的意思是“安全”)不要这样做:

    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)
    

    【讨论】:

      【解决方案3】:

      好吧,有多种方法可以解决这个问题,一种常见的方法是使用当前时间并对其执行 md5() 。随后,您可以检查您的数据库是否曾经使用过。通常,有 2 个 md5() 产生相同字符串的概率非常低。

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

      希望对你有帮助(:

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 我不同意。查看此问题的 URL...http://stackoverflow.com/questions/5885970/generating-unique-random-alpha-numeric-strings/5886021#5886021 GUID 会比 URL 的 generating-unique-random-alpha-numeric-strings 部分短。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-02-17
        • 2011-08-23
        • 2010-09-08
        • 2012-11-21
        • 2010-10-18
        • 2013-10-14
        相关资源
        最近更新 更多