繁体   English   中英

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

[英]Generate a random string of specified length that contains only specified characters (in Java)

有人知道在Java中生成指定长度和字符的随机String的好方法吗?

例如,“长度”可以是5,“可能的字符”可以是“ a,b,c,1,2,3 ,!”。

所以

c!a1b有效

cba16不是。

我可以尝试从头开始编写一些东西,但我觉得这对于生成密码,生成优惠券代码等必定是一个常见用例。

有任何想法吗?

执行此操作的代码很短。 使用char []或具有N个合法字符的String,并在长度上选择一个介于0到N-1之间的随机数R,使用R来选择一个字符以附加到生成的String上。

你想要这样的东西吗?

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));

我可以尝试从头开始编写一些东西,但我觉得这对于生成密码,生成优惠券代码等必定是一个常见用例。

这种情况并不常见,每次的详细要求都不相同。 此外,代码很简单,以至于变得微不足道。 (模范下面的关注点……实际上是关于需求而非解决方案的。)

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


当您使用包含随机数的方案时,您需要意识到发生冲突的可能性。 也就是说,该方法将多次生成相同的随机字符串。 您可以通过使用更长的字符串来缓解这种情况,但这只能在一定程度上起作用……具体取决于您的随机数生成器。 (典型的随机数生成器实际上是伪随机数生成器,并产生最终循环的数字序列。即使使用完美的随机数生成器,在短序列上重复的概率也有限。)

实际上,这是为什么“一刀切”的解决方案不是一个好主意的另一个原因。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM