生成指定长度的随机字符串,该字符串仅包含指定的字符(在Java中)

时间:2012-06-06 22:53:49

标签: java random password-generator

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

例如'长度'可能是5和可能的挑战'可以是' a,b,c,1,2,3,!'。

所以

c!a1b有效

BUT

cba16不是。

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

有什么想法吗?

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

你想要这样的东西吗?

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 :(得分:1)

  

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

这并不常见,每次详细要求都不同。此外,代码很简单到微不足道的程度。 (模数下面的问题......实际上是关于要求而不是解决方案。)

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


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

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

答案 3 :(得分:1)

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

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