我已經去過這個網站很多次,並且找到了我的問題的答案,但是最終我發佈了一個我自己的問題!所以在我的軟件中,一個特定類的目標是生成固定長度的隨機密碼,由'低'ASCII字符組成。主要的問題是我不想兩次生成相同的密碼,但始終保證唯一性。最初,我使用了一個HashMap來散列我迄今爲止生成的每個密碼,並在返回前每次創建一個新的密碼時用作檢查。但是,Java HashMap對象的大小是有限的,最終Map會變得過飽和,無法維持可接受的檢索時間。以下是我對該問題的最新破解:Java中的高效非重複密碼生成器
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;
}
}
編輯:非常感謝設置建議。它現在也使我的代碼變得更加清潔!
我可以決定只使用啞生成方法,填補了BlockingQueue,只是其多線程死亡......
進一步澄清:這是不是意味着產生安全的密碼。它必須簡單地保證它將最終生成所有可能的密碼,並且對於給定的長度和字符集只會生成一次。
注:
我已經採取了每個人的見解,並得出這樣按順序產生可能的密碼,並將它們存儲到磁盤的結論可能是我最好的選擇。無論是或者只是允許重複的密碼,並補充多個發生器線程的低效率。
您是否知道這種避免重複事件的願望是[幫助盟軍贏得第二次世界大戰的納粹謎團密碼系統]的弱點(https://en.wikipedia.org/wiki/Enigma_machine) ? – 2012-04-19 06:08:58
爲什麼要避免兩次生成相同的密碼非常重要?只要重複的概率足夠低(並且不可預知),就不會有真正的安全性折中。 – 2012-04-19 06:11:57
如果它總是真的,那麼在你的Map中使用布爾值是否有任何理由?你可以嘗試使用'Set'代替 – MadcoreTom 2012-04-19 06:13:07