提供两种方法产生随机码,默认长度为8
有线程安全问题,需要加锁
速度快,但并发场景下可能比UUID方式慢
实现简单,可直接修改随机码位数
/**
* 随机码工具类,基于Collections.shuffle(list);
*/
public class ShuffleCodeUtil {
/**
* 随机码位数
*/
public static final int BITS = 8;
/**
* 字符列表大小 = 32 = 8个数字 + 24个字母
*/
private static final int SIZE = 32;
/**
* 字符列表:数字和字母
* 8个数字: 不包含0和1
* 24个字母: 不包含O和I
*/
private static final List<Character> CHARS = new ArrayList<>(SIZE);
// 初始化字符列表
static {
// 存入数字
for (char c = '2'; c <= '9'; c++) {
CHARS.add(c);
}
// 存入字母
for (char c = 'A'; c <= 'Z'; c++) {
if (c != 'O' && c != 'I') {
CHARS.add(c);
}
}
}
/**
* 产生一个随机码
*/
public static synchronized String getRandomCode() {
// 洗牌
Collections.shuffle(CHARS);
// 洗牌后前BITS个字符组成随机码
StringBuilder sb = new StringBuilder(BITS);
for (int i = 0; i < BITS; i++) {
sb.append(CHARS.get(i));
}
return sb.toString();
}
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
System.out.println("getRandomCode() = " + getRandomCode());
}
}
}
速度较慢,但没有线程安全问题
修改随机码位数需考虑越界异常
/**
* 随机码工具类,基于UUID
*/
public class RandomCodeUtil {
/**
* 随机码位数
*/
public static final int BITS = 8;
/**
* 字符数组长度 = 32 = 8个数字 + 24个字母
*/
private static final int LENGTH = 32;
/**
* 字符数组:数字和字母
* 8个数字: 不包含0和1
* 24个字母: 不包含O和I
*/
private static final char[] CHARS = new char[LENGTH];
// 初始化字符数组
static {
int i = 0;
// 存入数字
for (char c = '2'; c <= '9'; c++) {
CHARS[i++] = c;
}
// 存入字母
for (char c = 'A'; c <= 'Z'; c++) {
if (c != 'O' && c != 'I') {
CHARS[i++] = c;
}
}
}
/**
* 产生一个随机码
*/
public static String getRandomCode() {
// 产生一个UUID字符串
String uuid = UUID.randomUUID().toString().replace("-", "");
// step: 步长
int step = uuid.length() / BITS;
StringBuilder sb = new StringBuilder(BITS);
for (int i = 0; i < BITS; i++) {
// 根据位置i和步长step截取子串
String substring = uuid.substring(i * step, (i + 1) * step);
// 子串转int值
int subValue = Integer.parseInt(substring, 16);
// int值取余获取该位置字符
sb.append(CHARS[subValue % LENGTH]);
}
return sb.toString();
}
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
System.out.println("getRandomCode() = " + getRandomCode());
}
}
}