2013-01-22 2 views
2

J'ai écrit un code pour la génération de mot de passe aléatoire. Il y a une chaîne d'où je dois faire le mot de passe. mais voici un problème quand ..Génération de mot de passe aléatoire

  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]; 
     } 
    } 

est exécuté, il compte quelque espace que je ne want.coding ressemble SRY laid pour mes pauvres coding.i sais qu'il ya beaucoup plus moyen de le résoudre, mais Je veux passer par ceci. Il y a mon code. voici mon code

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); 
} 
} 

Une suggestion?

+0

J'ai beaucoup de mal à comprendre ce que vous demandez ici. Qu'entendez-vous par «ça compte un peu d'espace»? Compte les espaces? –

+0

Je ne comprends pas la question. Que veux-tu faire exactement? À quoi sert 'allowedCharacters'? – m0skit0

+0

semble travailler dur mais pas travailler intelligemment, essayer de réduire la complexité du code –

Répondre

1

« est exécuté, il compte quelque espace que je ne veux pas »

L'espace blanc est beacuse de votre For loop

que vous utilisiez la k variable pour toutes les tableaux, qui ont abouti à la valeur incrémentée de k chaque fois.Ainsi, cela faisait des «lacunes» entre vos tableaux.

Modifier à:

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); 

OutPut:

PSWD 
1234 
weakasor$* 
+0

grâce elle aide ..... – Taskin

+0

@Taskin Bienvenue :) –

2

Je générerais le nombre minimum de caractères, de chiffres et de symboles. Remplissez les autres caractères de manière aléatoire et mélangez le résultat. De cette façon, il répondra à vos exigences minimales avec un minimum d'effort.

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

Ok si vous ne me trompe pas voulez analyser le mot de passe généré et que vous voulez les mettre dans le tableau séparé. Voici l'extrait de majuscules.

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

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

Si vous voulez une chaîne aléatoire, vous pouvez faire:

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

Si vous voulez le rendre compatible avec une chaîne source, vous pouvez faire:

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

Cette dernière La méthode retournera la même chaîne pour la même chaîne source.

S'il n'y a qu'un jeu limité de caractères que vous souhaitez utiliser, vous pouvez simplement remplacer les caractères indésirables. Supposons que vous avez avez créé « randomString » comme ci-dessus, vous créez « randomString1 » avec:

randomString1 = UUID.fromString(randomString); 

Maintenant, remplacez les caractères indésirables dans « randomString » avec les caractères dans « randomString1 ». Vous pourriez répéter ceci si nécessaire.

Si vous ne vous souciez pas d'une taille/d'une étendue minimale, vous pouvez simplement supprimer les caractères.

Bonne chance.

Questions connexes