我已多次访问此网站,并找到了我的问题的答案,但最后我有时间发布我自己的问题!因此,我的软件中特定类的目标是生成固定长度的随机密码,由“低”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并将其多线程化为死...
进一步澄清:这并不意味着生成安全密码。它必须简单地保证它最终将生成所有可能的密码,并且对于给定的长度和字符集只能生成一次。
注意:
我已经了解了每个人的见解并得出结论,顺序生成可能的密码并将其存储到磁盘可能是我的最佳选择。或者只是允许重复密码并用多个Generator线程补充低效率。
答案 0 :(得分:1)
为什么不加密序号?
设n是序列中的第一个数字(不要以零开头)。设e是一些加密算法(例如RSA)。
然后你的密码是e(n),e(n + 1),e(n + 2),...
但我非常赞同Greg Hewgill和Ted Hopp,避免重复是比它值得更麻烦。