Java 生成随机码工具类 线程安全 两种方式

提供两种方法产生随机码,默认长度为8

方案1:基于 Collections.shuffle()

有线程安全问题,需要加锁
速度快,但并发场景下可能比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());
        }
    }
}

测试shuffle方式

方案2:基于UUID

速度较慢,但没有线程安全问题
修改随机码位数需考虑越界异常

/**
 * 随机码工具类,基于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());
        }
    }
}

测试UUID方式

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值