生成仅包含指定字符的指定长度的随机字符串(在 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 中)的主要内容,如果未能解决你的问题,请参考以下文章

获取指定长度的随机字符串

Python随机生成指定长度字符串并保存到mysql中

python中生成一个指定长度的随机字符串实现示例

commons-text 生成指定长度的随机字符串

JavaScript 随机生成指定字符串长度

Python--随机生成指定长度的密码