栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

方案1:基于 Collections.shuffle()

有线程安全问题,需要加锁
速度快,但并发场景下可能比UUID方式慢
实现简单,可直接修改随机码位数

public class ShuffleCodeUtil {
    
    public static final int BITS = 8;
    
    private static final int SIZE = 32;
    
    private static final List 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());
        }
    }
}

方案2:基于UUID

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

public class RandomCodeUtil {
    
    public static final int BITS = 8;
    
    private static final int LENGTH = 32;
    
    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());
        }
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1004556.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号