算法 - 随机密码生成算法
import java.util.Random;
/**
* Created by 谭健 on 2017/10/16. 11:13.
* © All Rights Reserved.
*/
public class Password {
public Password() {
}
public Password(int strengthLevel, int length) {
this.strengthLevel = strengthLevel;
this.length = length;
}
/**
* Password level config
* 1 level : only number
* 2 level : number and lowercase letters
* 3 level : number , lowercase letters , capital letters
* 4 level : number , lowercase letters , capital letters , special characters
*/
private int strengthLevel = 4;
private int length = 6;
private static final Random RANDOM = new Random();
public int getLength() {
return length;
}
public void setLength(int length) {
this.length = length;
}
public int getStrengthLevel() {
return strengthLevel;
}
public void setStrengthLevel(int strengthLevel) {
this.strengthLevel = strengthLevel;
}
private static final int randomMax = 100000000;
private static final int index = 1;
private static final int numberOfLetter = 26;
private static final int nunberIndex = 48;
private static final int numberMax = 9;
private static final int capitalIndex = 65;
private static final int lowercaseIndex = 97;
private static final int special = 0;
private static final int[][] specialCharacter = {{33, 14}, {58, 6}, {91, 5}, {123, 3}};
public String getRandomPassword() throws Exception {
StringBuffer buffer = new StringBuffer();
if (length <= 0)
throw new Exception("length can not <= 0");
for (int i = 0; i < length; i++)
buffer.append((char) getNextChar());
return buffer.toString();
}
private int getNextChar() throws Exception {
if (strengthLevel < 1 || strengthLevel > 4)
throw new Exception("This level is not supported");
int x = 0;
final int puppetLetter = RANDOM.nextInt(randomMax) % numberOfLetter;
final int puppetNumber = RANDOM.nextInt(randomMax) % numberMax + nunberIndex;
final int levelIndex = RANDOM.nextInt(randomMax) % strengthLevel;
final int specialType = RANDOM.nextInt(randomMax) % specialCharacter.length;
final int specialInt = RANDOM.nextInt(randomMax) % specialCharacter[specialType][index] + specialCharacter[specialType][special];
switch (strengthLevel) {
case 1:
x = puppetNumber;
break;
case 2:
if (levelIndex == index)
x = puppetNumber;
else
x = puppetLetter + lowercaseIndex;
break;
case 3:
if (levelIndex == 0)
x = puppetNumber;
else if (levelIndex == index)
x = puppetLetter + lowercaseIndex;
else
x = puppetLetter + capitalIndex;
break;
case 4:
if (levelIndex == 0)
x = puppetNumber;
else if (levelIndex == index)
x = puppetLetter + lowercaseIndex;
else if (levelIndex == index * 2)
x = puppetLetter + capitalIndex;
else
x = specialInt;
break;
default:
}
return x;
}
public static void main(String[] args) {
System.out.println(System.currentTimeMillis());
Password password = new Password();
for (int i = 0; i < 10000; i++)
try {
System.out.println(password.getRandomPassword());
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(System.currentTimeMillis());
}
}