java - Passay生成密码不重复字符
问题描述
目前,我正在使用 passay 生成随机密码。
new PasswordGenerator().generatePassword(8,
Arrays.asList(
new CharacterRule( EnglishCharacterData.UpperCase, 2 ),
new CharacterRule( EnglishCharacterData.LowerCase, 2 ),
new CharacterRule( EnglishCharacterData.Digit, 2 ),
new CharacterRule( EnglishCharacterData.Special, 2 ) ) );
我可以知道如何生成随机密码而不重复任何字符吗?
Password: abcxyz12 //valid
Password: abcxyzpa // invalid because a is repeating
我正在使用 passay 生成密码
<dependency>
<groupId>org.passay</groupId>
<artifactId>passay</artifactId>
<version>1.2.0</version>
</dependency>
解决方案
查看源代码,您可以指定特定字符的最小数量,但不能指定最大数量。
所以我认为最简单的方法是使用这个库生成一个大密码,然后删除重复字符,然后限制你想要的长度:
StringBuilder sb = new StringBuilder();
generatePassword.chars()
.distinct()
.limit(8)
.forEach(c -> sb.append((char) c));
System.out.println(sb.toString());
这可能效率有点低,所以如果性能很关键,我建议编写自己的生成器(我刚刚尝试过,创建一个并不难)。您可以在org.passay.EnglishCharacterData中找到字符集。
推荐阅读
- python - 如何访问切换按钮的个人风格?
- android - dimens.xml 中屏幕宽度和最小屏幕宽度的区别
- r - 通过 POST 请求使用管道工接收 csv
- intellij-idea - IntelliJ:重构签名以使用参数属性
- php - 如何使用 php 遍历这个 json 并将其中的项目添加到 mysqli 数据库中?
- c - 我可以在 for 循环中跳过 i 的值吗?
- r - 如何使用分组变量对 kableExtra 中的行进行分组:`pack_rows()`?
- python - 将函数的返回变量附加到不同的列表中
- mysql - 优化mysql的查询
- oracle - 执行程序错误“ORA-00911:无效字符”