2013-01-22 190 views
2

我已經編寫了一個隨機密碼生成的代碼。有一個字符串從我必須使password.so我嘗試根據大寫字母數組,小寫數組和數字數組分類字符串。但這裏來的時候..隨機密碼生成

  for(int k=0;k<Length;k++){ 
     if(asc[k]>=65 && asc[k]<=90){ 
      UpperCase[k]=(char)asc[k]; 
     } 
     else if(asc[k]>=48 && asc[k]<=57){ 
      Digit[k]=(char)asc[k]; 
     } 
     else { 
      Mixed[k]=(char)asc[k]; 
     } 
    } 

執行的時候有問題計數一些空間,我不want.coding貌似醜陋的SRY我可憐coding.i知道有很多事情需要解決這個問題的方式,但我想通過這個。這裏是我的代碼。這裏是我的代碼

import java.util.Random; 

    public class Randompassgeneration 
    { 

final int MAX_LENGTH = 20; 
final int MIN_LENGTH = 3; 

char[] password=new char[25]; 
int [] asc=new int[18]; 
char[] UpperCase=new char[25]; 
char[] Digit=new char[25]; 
char[] Mixed=new char[25]; 
public void generate(String allowedCharacters) 
{ 
    int Length=allowedCharacters.length(); 


    for (int i=0;i<Length;i++) 
    { 
     asc[i]=(int)allowedCharacters.charAt(i); 

    } 
    for (int k=0;k<Length;k++) 
    { 
     if (asc[k]>=65 && asc[k]<=90) 
     { 
      UpperCase[k]=(char)asc[k]; 
     } 
     else if (asc[k]>=48 && asc[k]<=57) 
     { 
      Digit[k]=(char)asc[k]; 
     } 
     else 
     { 
      Mixed[k]=(char)asc[k]; 
     } 
    } 

    String rp=null; 
    StringBuilder Strbld=new StringBuilder(); 
    Random rnd=new Random(); 
    int ranStrLen=rnd.nextInt(MAX_LENGTH - MIN_LENGTH + 1) + MIN_LENGTH; 
    Strbld.append(UpperCase[rnd.nextInt(UpperCase.length)]); 
    Strbld.append(Digit[rnd.nextInt(Digit.length)]); 

    for (int m=0; m<ranStrLen-2; m++) 
    { 
     Strbld.append(Mixed[rnd.nextInt(Mixed.length)]); 

    } 

    System.out.print(ranStrLen +"->"+ Strbld.toString()); 


} 

public static void main(String[] args) 
{ 
    String allowedCharacters = "weakPasSWorD1234$*"; 
    Randompassgeneration t=new Randompassgeneration(); 
    t.generate(allowedCharacters); 
} 
} 

任何類型的建議?

+0

我很難理解你在這裏問什麼。 「它代表一些空間」是什麼意思?計數空格? –

+0

我不明白這個問題。你想要做什麼? 'allowedCharacters'的用途是什麼? – m0skit0

+0

看起來像努力工作,但不聰明的工作,試圖降低代碼的複雜性 –

回答

1

「則執行其計數一些空間,我不希望」

白色空間是怎麼一回事,因爲你For loop

您使用的變量k所有的數組,導致每次增加k的值。所以,這會在你的數組之間造成「空白」。

將其更改爲:

int point1=0,point2=0,point3=0; 
for (int k=0;k<Length;k++) 
{ 
    if (asc[k]>=65 && asc[k]<=90) 
    { 
     UpperCase[point1]=(char)asc[k];point1++; 
     continue; 
    } 
    else if (asc[k]>=48 && asc[k]<=57) 
    { 
     Digit[point2]=(char)asc[k];point2++; 
     continue; 
    } 
    else 
    { 
     Mixed[point3]=(char)asc[k];point3++; 
    } 

} 
System.out.println(UpperCase); 
System.out.println(Digit); 
System.out.println(Mixed); 

輸出:

PSWD 
1234 
weakasor$* 
+0

感謝它有助於產生隨機數..... – Taskin

+0

@Taskin歡迎:) –

2

我會生成最少數量的字符,數字和符號。隨機填寫其他字符並對結果進行洗牌。這樣,它將以最小的努力符合您的最低要求。

public static String passwordGenerator() { 
    List<Character> chars = new ArrayList<>(); 
    Random rand = new Random(); 
    // min number of digits 
    for (int i = 0; i < 1; i++) chars.add((char) ('0' + rand.nextInt(10))); 
    // min number of lower case 
    for (int i = 0; i < 2; i++) chars.add((char) ('a' + rand.nextInt(26))); 
    // min number of upper case 
    for (int i = 0; i < 1; i++) chars.add((char) ('A' + rand.nextInt(26))); 
    // min number of symbols 
    String symbols = "!\"$%^&*()_+{}:@~<>?,./;'#][=-\\|'"; 
    for (int i = 0; i < 1; i++) chars.add(symbols.charAt(rand.nextInt(symbols.length()))); 
    // fill in the rest 
    while (chars.size() < 8) chars.add((char) ('!' + rand.nextInt(93))); 
    // appear in a random order 
    Collections.shuffle(chars); 
    // turn into a String 
    char[] arr = new char[chars.size()]; 
    for (int i = 0; i < chars.size(); i++) arr[i] = chars.get(i); 
    return new String(arr); 
} 

public static void main(String... args) { 
    for (int i = 0; i < 100; i++) 
     System.out.println(passwordGenerator()); 
} 
1

好吧如果沒記錯要分析生成的密碼,並希望把他們在不同的陣列。這是大寫的片段。

ArrayList<Character> uppercase = new ArrayList<Character>(); 

char pass[] = password.toCharArray(); 
for(char c: pass){ 
    if(Character.isUpperCase(c)) 
     uppercase.add(c); 
} 
1

如果你想有一個隨機字符串,你可以這樣做:

public String getRandomString(){ 
    return UUID.randomUUID().toString(); 
} 

如果你想讓它與一些源字符串一致的,你可以這樣做:

public String getConsistentHash(String source){ 
    return UUID.nameUUIDFromBytes(source.getBytes()).toString(); 
} 

後者方法將爲相同的源字符串返回相同的字符串。

如果您只想使用有限的一組字符,則可以只更換不需要的字符。假設你已經創建了「randomString」如上述,爲您打造「randomString1」有:

randomString1 = UUID.fromString(randomString); 

現在,隨着「randomString1」的字符替換「randomString」不需要的字符。如有必要,您可以重複此操作。

如果你不關心最小尺寸/點差,你可以刪除字符。

祝你好運。