我已经多次访问这个网站并找到了我的问题的答案,但现在是我发布自己的问题的时候了!因此,我的软件中特定类的目标是生成固定长度的随机密码,由“低”ASCII 字符组成。主要问题是我不想两次生成相同的密码,但始终保证唯一性。最初,我使用HashMap来对迄今为止生成的每个密码进行哈希处理,并在每次创建新密码时用作检查,然后再返回。但是,Java HashMap 对象的大小有限,最终 Map 会变得过于饱和而无法维持可接受的检索时间。以下是我对这个问题的最新破解:
package gen;
import java.util.Set;
import java.util.Random;
import java.util.HashSet;
public class Generator {
Random r;
int length;
Set<String> seen;
public Generator(int l){
seen = new HashSet<String>();
length = l;
r = new Random();
r.setSeed(System.currentTimeMillis());
}
public String generate(){
String retval = "";
int i = 0;
while(i<length){
int rand = r.nextInt(93)+33;
if(rand!=96){
retval+= (char)rand;
i++;
}
}
return retval;
}
public String generateNoRepeat(){
String retval;
int i;
do{
retval ="";
i = 0;
while(i<length){
int rand = r.nextInt(93)+33;
if(rand!=96){
retval+= (char)rand;
i++;
}
}
}while(!seen.add(retval));
return retval;
}
}
编辑:非常感谢 Set 建议。它现在也让我的代码更干净了!
我可能决定只使用愚蠢的生成器方法来填充BlockingQueue并将其多线程化至死......
进一步说明:这并不意味着生成安全密码。它必须简单地保证它最终会生成所有可能的密码,并且对于给定的长度和字符集只生成一次。
笔记:
我听取了每个人的见解并得出结论,顺序生成可能的密码并将它们存储到磁盘可能是我最好的选择。要么,要么简单地允许重复密码,并通过多个生成器线程来补充效率低下。