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

Java中高效的非重复密码生成器,java,random,passwords,generator,non-repetitive,Java,Random,Passwords,Generator,Non Repetitive,我已经去过这个网站很多次,找到了我的问题的答案,但现在终于到了我发布我自己的问题的时候了!因此,我的软件中的特定类的目标是生成固定长度的随机密码,由“低”ASCII字符组成。主要的问题是,我不想两次生成相同的密码,但总是保证唯一性。最初,我使用一个来散列到目前为止生成的每个密码,并在每次返回之前创建新密码时用作检查。但是,Java HashMap对象的大小是有限的,最终映射将变得过于饱和,无法维持可接受的检索时间。以下是我对这个问题的最新研究: package gen; import java

我已经去过这个网站很多次,找到了我的问题的答案,但现在终于到了我发布我自己的问题的时候了!因此,我的软件中的特定类的目标是生成固定长度的随机密码,由“低”ASCII字符组成。主要的问题是,我不想两次生成相同的密码,但总是保证唯一性。最初,我使用一个来散列到目前为止生成的每个密码,并在每次返回之前创建新密码时用作检查。但是,Java HashMap对象的大小是有限的,最终映射将变得过于饱和,无法维持可接受的检索时间。以下是我对这个问题的最新研究:

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;
}
}
package-gen;
导入java.util.Set;
导入java.util.Random;
导入java.util.HashSet;
公共类生成器{
随机r;
整数长度;
集看到;
公共发电机(int l){
seen=newhashset();
长度=l;
r=新随机数();
r、 设置速度(System.currentTimeMillis());
}
公共字符串生成(){
字符串retval=“”;
int i=0;

而(i为什么不只加密序列号

让n成为序列中的第一个数字(不要以零开头)。让e成为某种加密算法(例如RSA)

那么你的密码是e(n),e(n+1),e(n+2)


但是我非常同意Greg Hewgill和Ted Hopp的观点,避免重复密码比它的价值更麻烦。

你知道吗,这种避免重复的愿望是密码的弱点吗?为什么避免两次生成同一密码如此重要?只要重复密码的概率足够低(而且不可预测)在安全性方面没有真正的妥协。如果布尔值总是正确的,那么在
映射中使用布尔值有什么理由吗?你可以尝试使用
来代替它。嗯,我认为你是对的,它似乎符合要求,但它是有界的……如果你正在生成密码,那么你可能想使用securerandom。你熟悉conc吗利用性搜索算法的ept(如字典攻击)?这正是我想要的,但我希望每个密码的生成概率仍然尽可能接近相等。不过,你的观点很好。我得出的结论是,生成所有可能的密码并将其存储在磁盘上是可行的。这样,我所要做的就是跟踪剩余密码的数量并删除密码每次我都决定“使用”索引。