Java中高效的非重复密码生成器

时间:2012-04-19 06:05:52

标签: java random passwords generator non-repetitive

我已多次访问此网站,并找到了我的问题的答案,但最后我有时间发布我自己的问题!因此,我的软件中特定类的目标是生成固定长度的随机密码,由“低”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线程补充低效率。

1 个答案:

答案 0 :(得分:1)

为什么不加密序号?

设n是序列中的第一个数字(不要以零开头)。设e是一些加密算法(例如RSA)。

然后你的密码是e(n),e(n + 1),e(n + 2),...

但我非常赞同Greg Hewgill和Ted Hopp,避免重复是比它值得更麻烦。