首页 > 编程语言 >雪花算法生成唯一id的工具类

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

时间:2024-11-03 16:31:51浏览次数:1  
标签:return sums 算法 long 雪花 mac static 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

标签:return,sums,算法,long,雪花,mac,static,id
From: https://www.cnblogs.com/expiator/p/18523583

相关文章

  • docker bulid tag push到自己的docker hub 仓库
      -t(或 --tag)参数:用于给构建的镜像指定标签(tag)。标签的格式通常是 [仓库名/][用户名/]镜像名:版本号-f(或 --file)参数: 指定构建镜像所使用的 Dockerfile 的路径。默认情况下,dockerbuild 会在当前目录下查找名为 Dockerfile 的文件,但通过这个参数可以指定其他位......
  • 【算法】记忆化搜索
    [!TIP]一种剪枝算法,优化运算效率,减少冗余计算基本内容入门例子[P1028[NOIP2001普及组]数的计算]([P1028NOIP2001普及组]数的计算-洛谷|计算机科学教育新生态)题目要求:输入n,输出一共可以构造多少个数列,要求数列的第i不能超过第i-1个数的一半示例:输入6,只能输......
  • 机器学习算法在金融信贷风控模型中的应用毕业论文【附数据】
    ......
  • WPF datagrid implement multi select via behavior selectionchanged event in MVVM
    <DataGridItemsSource="{BindingBooksCollection,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"CanUserAddRows="False"AutoGenerateColumns="False"SelectionMode="Extended">......
  • 4.2 Druid 连接池
    数据源连接池当我们掌握了Java数据库的操作能力后,就必然会面对一个新的问题,那就是性能优化,一般来说数据源连接池是最佳的优化方案,可以对比想想之前学习的线程池知识。采用数据源连接池方案可以极大的提高了数据处理能力,因为Java连接数据库是比较耗时的,如果每次查询都重新连接......
  • 【笔记/模板】A*算法
    A*算法定义A*搜索算法(\(\text{A*searchalgorithm}\))是一种在图形平面上,对于有多个节点的路径求出最低通过成本的算法。它属于图遍历(英文:\(\text{Graphtraversal}\))和最佳优先搜索算法(英文:\(\text{Best-firstsearch}\)),亦是BFS的优化,用到了启发式搜索的思维。启发式搜索(......
  • ABC370 E - Avoid K Partition
    ABC370E-AvoidKPartition求一个序列的合法划分方案数。一种划分合法当且仅当没有一个子串的和是\(k\)。由于是否存在子串和为\(k\)很重要,因此考虑将它加入状态设计中,记\(f[i][0/1]\)表示\(1\simi\),\(i\)处结束,还没有/已有和为\(k\)的子段,方案数。用\(s[i]\)......
  • 【Python】深入解析Python中的多重继承与MRO:原理、C3线性化算法与super()用法
    解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界Python的多重继承机制允许一个类从多个父类中继承属性和方法,这带来了极大的灵活性和复用性,但也引发了“菱形继承”问题,即多条继承路径导致同一属性或方法重复调用。为了解决此问题,Python引入了MRO(方法解析顺序)规......
  • IDEA 内置的 git 插件太好用了!附使用技巧分享。
    最近发现,clion里的git插件甚至能列出文件夹的修改历史,太方便了!分享一些经验技巧:提交UI具有多个视图模式。提交GUI可以放在底部,也可以显示为侧面板或模态对话框。有时很难切换。LocalChanges选项卡包含修改过未提交的文件列表。默认情况下,新文件折叠在底部的树......
  • 使用wxpython开发跨平台桌面应用,常用窗体布局BoxSizer,FlexGridSizer,GridBagSizer的介
    我们在开发桌面应用的时候,不管是之前C#开发Winform的时候,还是现在使用wxpython来开发跨平台应用的时候,都需要了解布局的处理,wxpython的常用布局Sizer类,包括BoxSizer,FlexGridSizer,GridBagSizer都是我们需要经常打交道的,因此有必要对它们进行一些了解,这样开发界面起来才能得心应手......