生成一个8-20个字符,且必须包含字母、数字和特殊符号
package ***;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
/**
* 底座密码生成
* @author ****
* @since 2023/8/28 17:10
*/
public class PasswordGenerator {
/**
* 生成指定范围的随机数
*/
private static int randomNum(int min, int max) {
Random rand = new Random();
return rand.nextInt(max - min + 1) + min;
}
/**
* 数组乱序,洗牌算法:从数组末尾开始,选取最后一个元素,与数组中随机一个位置的元素交换位置,依次类推
*/
private static void shuffle(List<Object> list) {
int size = list.size();
for (int i = size; i > 1; i--) {
Collections.swap(list, i - 1, randomNum(0, i - 1));
}
}
/**
* 随机生成一个字母
*/
private static char createLetter() {
char[] letters = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
int index = randomNum(0, letters.length - 1);
return letters[index];
}
/**
* 随机生成一个特殊符号
*/
private static char createSpecialCode() {
char[] specialCodes = {'~', '!', '@', '#', '%', '^', '&', '*', '_', '-', '+', '=', '`', '?', '|', ':', ';', ',', '.'};
int index = randomNum(0, specialCodes.length - 1);
return specialCodes[index];
}
/**
* 随机生成密码:要求包含数字+字母+特殊字符,长度8-20
* 密码不固定位数:2个字符 + 4个数字 + 2到14个字母
*/
public static String createPwd(int min, int max) {
List<Object> pwdList = new ArrayList<>();
for (int i = 0; i < 2; i++) {
char code = createSpecialCode();
pwdList.add(code);
}
for (int i = 0; i < 4; i++) {
int number = randomNum(0, 9);
pwdList.add(number);
}
int letterNum = randomNum(min - 6, max - 6);
for (int i = 0; i < letterNum; i++) {
char letter = createLetter();
pwdList.add(letter);
}
shuffle(pwdList);
StringBuilder sb = new StringBuilder();
for (Object obj : pwdList) {
sb.append(obj);
}
return sb.toString();
}
public static void main(String[] args) {
// 指定密码长度为8-20
String password = createPwd(8, 20);
System.out.println(password);
}
}