package org.jeecg.modules.util;
import java.security.SecureRandom;
public class RandomStringUtil {
private static final String LOWERCASE_CHARACTERS = "abcdefghijklmnopqrstuvwxyz";
private static final String UPPERCASE_CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
private static final String DIGITS = "0123456789";
private static final String ALL_CHARACTERS = LOWERCASE_CHARACTERS + UPPERCASE_CHARACTERS + DIGITS;
private static final SecureRandom RANDOM = new SecureRandom();
public static String generateRandomString(int length) {
StringBuilder randomString = new StringBuilder(length);
// 确保至少包含一个小写字母、一个大写字母和一个数字字符
randomString.append(LOWERCASE_CHARACTERS.charAt(RANDOM.nextInt(LOWERCASE_CHARACTERS.length())));
randomString.append(UPPERCASE_CHARACTERS.charAt(RANDOM.nextInt(UPPERCASE_CHARACTERS.length())));
randomString.append(DIGITS.charAt(RANDOM.nextInt(DIGITS.length())));
// 生成剩余的字符
for (int i = 3; i < length; i++) {
randomString.append(ALL_CHARACTERS.charAt(RANDOM.nextInt(ALL_CHARACTERS.length())));
}
// 洗牌字符,使其顺序随机
return shuffleString(randomString.toString());
}
// 函数用于洗牌字符串中的字符
private static String shuffleString(String input) {
char[] characters = input.toCharArray();
for (int i = characters.length - 1; i > 0; i--) {
int randomIndex = RANDOM.nextInt(i + 1);
char temp = characters[i];
characters[i] = characters[randomIndex];
characters[randomIndex] = temp;
}
return new String(characters);
}
public static void main(String[] args) {
String randomString = generateRandomString(6);
System.out.println("随机字符串: " + randomString);
}
}
用触发器,表序列实现,序列参数传入工具类
-- 用户序列表
create table app_user_sequence (
squence_id int(11),
name varchar(50)
);
INSERT INTO app_user_sequence (`squence_id`, `name`) VALUES (0, 'tests');
-- 触发器,每次appuser表新增数据为squence_id插入新值
DELIMITER //
CREATE TRIGGER insert_sequence BEFORE INSERT ON app_user
FOR EACH ROW
BEGIN
declare i int;
declare str varchar(50);
set str = 'tests';
set i=(select squence_id from app_user_sequence where name = str);
update app_user_sequence
set squence_id = i + 1
where name = str;
END //
工具类
package org.jeecg.modules.develop.api.livePort;
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
public class test {
/**
* 自定义进制(排除0,1,o,l)
*/
private static final char[] CUSTOM = new char[]{'Q', 'W', 'E', '8', 'A', 'S', '2', 'D', 'Z', 'X', '9', 'C', '7', 'P', '5', 'I', 'K', '3', 'M', 'J', 'U', 'F', 'R', '4', 'V', 'Y', 'L', 'T', 'N', '6', 'B', 'G'};
/**
* 不能与自定义进制有重复
*/
private static final char FLAG = 'H';
/**
* 进制长度
*/
private static final int LENGTH = CUSTOM.length;
/**
* 序列最小长度
*/
private static final int MINLENGTH = 6;
/**
* 根据ID生成六位随机码
* @return 随机码
*/
public static String generateCode(long id) {
char[] buf = new char[32];
int charPos = 32;
while ((id / LENGTH) > 0) {
int ind = (int) (id % LENGTH);
buf[--charPos] = CUSTOM[ind];
id /= LENGTH;
}
buf[--charPos] = CUSTOM[(int) (id % LENGTH)];
String str = new String(buf, charPos, (32 - charPos));
// 不够长度的自动随机补全
if (str.length() < MINLENGTH) {
StringBuilder sb = new StringBuilder();
sb.append(FLAG);
Random rnd = new Random();
for (int i = 1; i < MINLENGTH - str.length(); i++) {
sb.append(CUSTOM[rnd.nextInt(LENGTH)]);
}
str += sb.toString();
}
return str;
}
public static long codeToId(String code) {
char chs[] = code.toCharArray();
long res = 0L;
for (int i = 0; i < chs.length; i++) {
int ind = 0;
for (int j = 0; j < LENGTH; j++) {
if (chs[i] == CUSTOM[j]) {
ind = j;
break;
}
}
if (chs[i] == FLAG) {
break;
}
if (i > 0) {
res = res * LENGTH + ind;
} else {
res = ind;
}
}
return res;
}
public static void main(String[] args) {
Set<String> stringSet = new HashSet<>();
// for (int i = 1000000; i < 2000000; i++) {
// System.out.println("========="+generateCode(i));
//
// stringSet.add(generateCode(i));
// }
// System.out.println(stringSet.size());
// System.out.println(generateCode(1588081622644224001L));
}
}
方法3 用mybatis plus 生成主键雪花id,作为工具类参数
package org.jeecg.modules.util;
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
public class SquenceUtil {
/**
* 自定义进制
*/
private static final char[] CUSTOM = new char[]{'q', 'w', 'e', '8', 'a', 's', '2', 'd', 'z', 'x', '9', 'c', '7', 'p', '5', 'i', 'k', '3', 'm', 'j', 'u', 'f', 'r', '4', 'v', 'y', 'l', 't', 'n', '6', 'b', 'g'};
/**
* 不能与自定义进制有重复
*/
private static final char FLAG = 'h';
/**
* 进制长度
*/
private static final int LENGTH = CUSTOM.length;
/**
* 序列最小长度
*/
private static final int MINLENGTH = 6;
/**
* 根据ID生成六位随机码
* @return 随机码
*/
public static String generateCode(long id) {
char[] buf = new char[32];
int charPos = 32;
int index_seq = 0;
while (index_seq < 5) {
int ind = (int) (id % LENGTH);
buf[--charPos] = CUSTOM[ind];
id /= LENGTH;
index_seq ++;
}
buf[--charPos] = CUSTOM[(int) (id % LENGTH)];
String str = new String(buf, charPos, (32 - charPos));
// 不够长度的自动随机补全
if (str.length() < MINLENGTH) {
StringBuilder sb = new StringBuilder();
sb.append(FLAG);
Random rnd = new Random();
for (int i = 1; i < MINLENGTH - str.length(); i++) {
sb.append(CUSTOM[rnd.nextInt(LENGTH)]);
}
str += sb.toString();
}
return str;
}
public static long codeToId(String code) {
char chs[] = code.toCharArray();
long res = 0L;
for (int i = 0; i < chs.length; i++) {
int ind = 0;
for (int j = 0; j < LENGTH; j++) {
if (chs[i] == CUSTOM[j]) {
ind = j;
break;
}
}
if (chs[i] == FLAG) {
break;
}
if (i > 0) {
res = res * LENGTH + ind;
} else {
res = ind;
}
}
return res;
}
public static void main(String[] args) {
System.out.println("========="+generateCode(1665954160288321537L));
Set<String> stringSet = new HashSet<>();
// for (int i = 1000000; i < 2000000; i++) {
// System.out.println("========="+generateCode(i));
//
// stringSet.add(generateCode(i));
// }
// System.out.println(stringSet.size());
// System.out.println(generateCode(1588081622644224001L));
}
}