雪花算法生成唯一id的工具类

maven 依赖包

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.9</version>
        </dependency>
        
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.6</version>
        </dependency>

工具类代码:

public class SnowflakeUtil {
    private static final Snowflake SNOW_FLAKE = IdUtil.getSnowflake(getWorkId(), getDataCenterId());

    private SnowflakeUtil() {}

    /**
     * 雪花算法,生成唯一id。
     * 
     */
    public static synchronized long snowflakeId() {
        return SNOW_FLAKE.nextId();
    }

    public static synchronized long snowflakeId(long workerId, long dataCenterId) {
        Snowflake snowflake = IdUtil.getSnowflake(workerId, dataCenterId);
        return snowflake.nextId();
    }

    /**
     * 获取机器id
     */
    private static Long getWorkId() {
        try {
            String hostAddress = InetAddress.getLocalHost().getHostAddress();
            //commons-lang3 的版本,可以选择 3.9.0 及以上。太低的版本没有这个方法
            //StringUtils.toCodePoints 用于将字符串转换为一系列的Unicode码点(code points)
            int[] ints = StringUtils.toCodePoints(hostAddress);
            int sums = 0;
            for (int b : ints) {
                sums += b;
            }
            return (long) (sums % 32);
        } catch (UnknownHostException e) {
            log.error("UnknownHostException error.", e);
            // 如果获取失败,则使用随机数备用
            return RandomUtils.nextLong(0, 31);
        }
    }

    /**
     * 获取数据id
     */
    protected static long getDataCenterId() {
        long id = 0L;
        try {
            //获取本机(或者服务器ip地址),类似 DESKTOP-abcdefg/192.168.1.87
            InetAddress ip = InetAddress.getLocalHost();
            NetworkInterface network = NetworkInterface.getByInetAddress(ip);
            if (network == null) {
                id = 1L;
            } else {
                //获取物理网卡地址
                byte[] mac = network.getHardwareAddress();
                if (null != mac) {
                    id = ((0x000000FF & (long) mac[mac.length - 2]) |
                            (0x0000FF00 & (((long) mac[mac.length - 1]) << 8))) >> 6;
                    id = id % (31 + 1);
                }
            }
        } catch (Exception e) {
            return RandomUtils.nextLong(0, 31);
        }
        return id;
    }

}


参考资料

https://blog.csdn.net/qq_46504841/article/details/131457007

posted on   乐之者v  阅读(94)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
历史上的今天:
2023-11-03 intellij idea拉取最新的依赖包
2017-11-03 mybatis什么时候需要声明jdbcType?
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示