2012-04-19 125 views
0

我已經去過這個網站很多次,並且找到了我的問題的答案,但是最終我發佈了一個我自己的問題!所以在我的軟件中,一個特定類的目標是生成固定長度的隨機密碼,由'低'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,只是其多線程死亡......

進一步澄清:這是不是意味着產生安全的密碼。它必須簡單地保證它將最終生成所有可能的密碼,並且對於給定的長度和字符集只會生成一次。

注:

我已經採取了每個人的見解,並得出這樣按順序產生可能的密碼,並將它們存儲到磁盤的結論可能是我最好的選擇。無論是或者只是允許重複的密碼,並補充多個發生器線程的低效率。

+4

您是否知道這種避免重複事件的願望是[幫助盟軍贏得第二次世界大戰的納粹謎團密碼系統]的弱點(https://en.wikipedia.org/wiki/Enigma_machine) ? – 2012-04-19 06:08:58

+1

爲什麼要避免兩次生成相同的密碼非常重要?只要重複的概率足夠低(並且不可預知),就不會有真正的安全性折中。 – 2012-04-19 06:11:57

+0

如果它總是真的,那麼在你的Map中使用布爾值是否有任何理由?你可以嘗試使用'Set'代替 – MadcoreTom 2012-04-19 06:13:07

回答

1

爲什麼不只是加密連續數字?

設n是序列中的第一個數字(不要從零開始)。設e是某種加密算法(如RSA)。

那麼你的密碼是E(N),E(N + 1),E(N + 2),...

但我嚴重格雷格Hewgill和特德·霍普同意,避免重複是比較麻煩比它值得。

+0

您是否熟悉開發性搜索算法(如字典式攻擊)的概念?這就是我所要做的,但我希望每個密碼的生成概率仍儘可能接近相等。不過你說得很好。 – Fz3 2012-04-19 06:34:06

+0

我得出的結論是,生成所有可能的密碼並將它們存儲在磁盤上是一種方法。這樣,我需要做的就是跟蹤我剩下的人數,並刪除我決定每次使用的索引。 – Fz3 2012-04-19 08:23:39