生成仅包含指定字符的指定长度的随机字符串(在 Java 中)
Posted
技术标签:
【中文标题】生成仅包含指定字符的指定长度的随机字符串(在 Java 中)【英文标题】:Generate a random string of specified length that contains only specified characters (in Java) 【发布时间】:2012-06-11 00:19:37 【问题描述】:有没有人知道在Java中生成指定长度和字符的随机字符串的好方法。
例如,'length' 可以是 5,'possibleChars' 可以是 'a,b,c,1,2,3,!'。
所以
c!a1b 有效
但是
cba16 不是。
我可以尝试从头开始编写一些东西,但我觉得这一定是生成密码、生成优惠券代码等事情的常见用例......
有什么想法吗?
【问题讨论】:
创建一个允许的字符数组。在数组中生成随机索引。继续下去,直到你有足够的字符。 【参考方案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 网站,了解有关随机生成密码和其他内容的许多非常好的想法。
【讨论】:
以上是关于生成仅包含指定字符的指定长度的随机字符串(在 Java 中)的主要内容,如果未能解决你的问题,请参考以下文章