【问题标题】:Generate a random string of specified length that contains only specified characters (in Java)生成仅包含指定字符的指定长度的随机字符串(在 Java 中)
【发布时间】:2012-06-11 00:19:37
【问题描述】:

有没有人知道在Java中生成指定长度和字符的随机字符串的好方法。

例如,'length' 可以是 5,'possibleChars' 可以是 'a,b,c,1,2,3,!'。

所以

c!a1b 有效

但是

cba16 不是。

我可以尝试从头开始编写一些东西,但我觉得这一定是生成密码、生成优惠券代码等事情的常见用例......

有什么想法吗?

【问题讨论】:

  • 创建一个允许的字符数组。在数组中生成随机索引。继续下去,直到你有足够的字符。

标签: java random password-generator


【解决方案1】:

你想要这样的东西吗?

Random r=new Random();

char[] possibleChars="abc123!".toCharArray();
int length=5;

char[] newPassword=new char[length];

for (int i=0; i<length;i++)
    newPassword[i]=possibleChars[r.nextInt(possibleChars.length)];

System.out.println(new String(newPassword));

【讨论】:

    【解决方案2】:

    执行此操作的代码非常短。有一个带有 N 个合法字符的 char[] 或 String,并且,长度时间,选择一个介于 0 和 N-1 之间的随机数 R,使用 R 选择一个字符以附加到您生成的字符串。

    【讨论】:

      【解决方案3】:

      我可以尝试从头开始编写一些东西,但我觉得这一定是生成密码、生成优惠券代码等事情的常见用例......

      不是很常见,而且每次的详细要求都不一样。此外,代码简单到微不足道。 (模数下面的关注点......这实际上是关于需求而不是解决方案。)

      简而言之,编写自己的方法比寻找执行此操作的现有库方法要快。


      当您使用涉及随机数的方案时,您需要注意可能会发生冲突;即该方法将不止一次生成相同的随机字符串。您可以通过使用更长的字符串来缓解这种情况,但这仅适用于某一点……取决于您的随机数生成器。 (典型的随机数生成器实际上是伪随机数生成器,并产生最终循环的数字序列。即使使用完美的随机数生成器,在短序列上重复的概率也是有限的。)

      事实上,这也是为什么“一刀切”解决您的问题不是一个好主意的另一个原因。

      【讨论】:

        【解决方案4】:

        如果这是为了真正的安全,而不是家庭作业或编程练习,那么请使用 SecureRandom,而不是 Random。

        阅读Diceware 网站,了解有关随机生成密码和其他内容的许多非常好的想法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-13
          • 1970-01-01
          • 2018-01-25
          • 1970-01-01
          • 2021-03-15
          相关资源
          最近更新 更多