0

我已经多次访问这个网站并找到了我的问题的答案,但现在是我发布自己的问题的时候了!因此,我的软件中特定类的目标是生成固定长度的随机密码,由“低”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并将其多线程化至死......

进一步说明:这并不意味着生成安全密码。它必须简单地保证它最终会生成所有可能的密码,并且对于给定的长度和字符集只生成一次。

笔记:

我听取了每个人的见解并得出结论,顺序生成可能的密码并将它们存储到磁盘可能是我最好的选择。要么,要么简单地允许重复密码,并通过多个生成器线程来补充效率低下。

4

1 回答 1

1

为什么不只加密序列号?

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

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

但我非常同意 Greg Hewgill 和 Ted Hopp 的观点,避免重复的麻烦多于其价值。

于 2012-04-19T06:28:22.137 回答