雪花算法id的多方面阐述

一、概述

雪花算法id是一个分布式可用的id生成器,也是现在广泛应用的分布式情况下生成全局唯一id的解决方案之一,所以对雪花算法id的深入了解十分有必要。

二、原理

雪花算法id的原理是利用当前时间戳、工作机器id、序列号三个部分来生成全局唯一id。

1、时间戳

时间戳是雪花算法id生成的第一部分,一般为41位,能够使用的时长最长约69年,当前时间戳减去一个固定的时间点比如“2020-01-01”后右移22位即可获得一个41位的时间戳。

2、工作机器id

工作机器id是一个在分布式系统中必须唯一的标识,一般为10位,5位表示数据中心id,5位表示机器id,能够使用的最多数据中心id数量是32个,每个数据中心内部最多机器数量是32个。

3、序列号

序列号是每个工作机器id内部单调递增的计数器,一般为12位,最多可以生成4096个id。序列号溢出后需要等到下一个毫秒进行生成。

三、代码实现

public class SnowflakeIdGenerator {

    // 开始时间戳
    private static final long BEGIN_TIMESTAMP = 1577808000000L;

    // 数据中心id的位数
    private static final long DATA_CENTER_ID_BITS = 5L;

    // 机器id的位数
    private static final long MACHINE_ID_BITS = 5L;

    // 序列号的位数
    private static final long SEQUENCE_BITS = 12L;

    // 数据中心id最大值
    private static final long MAX_DATA_CENTER_ID = ~(-1L << DATA_CENTER_ID_BITS);

    // 机器id最大值
    private static final long MAX_MACHINE_ID = ~(-1L << MACHINE_ID_BITS);

    // 序列号最大值
    private static final long MAX_SEQUENCE = ~(-1L << SEQUENCE_BITS);

    // 数据中心id左移位数(机器id内部共享此位)
    private static final long DATA_CENTER_LEFT_SHIFT = SEQUENCE_BITS + MACHINE_ID_BITS;

    // 机器id左移位数
    private static final long MACHINE_LEFT_SHIFT = SEQUENCE_BITS;

    // 时间戳左移位数
    private static final long TIMESTAMP_LEFT_SHIFT = DATA_CENTER_LEFT_SHIFT + DATA_CENTER_ID_BITS;

    // 数据中心id
    private long dataCenterId;

    // 机器id
    private long machineId;

    // 序列号
    private long sequence;

    // 最后生成id的时间戳
    private long lastTimestamp = -1L;
    
    /**
     * 构造函数
     * @param dataCenterId 数据中心id
     * @param machineId 机器id
     */
    public SnowflakeIdGenerator(long dataCenterId, long machineId) {
        if (dataCenterId  MAX_DATA_CENTER_ID) {
            throw new IllegalArgumentException("data center id can't be greater than " + MAX_DATA_CENTER_ID + " or less than 0");
        }
        if (machineId  MAX_MACHINE_ID) {
            throw new IllegalArgumentException("machine id can't be greater than " + MAX_MACHINE_ID + " or less than 0");
        }
        this.dataCenterId = dataCenterId;
        this.machineId = machineId;
    }
    
    /**
     * 生成id方法
     * @return id
     */
    public synchronized long generateId() {
        long currentTimestamp = System.currentTimeMillis();
        if (currentTimestamp < lastTimestamp) {
            throw new RuntimeException("Clock moved backwards. Refusing to generate id");
        }
        if (currentTimestamp == lastTimestamp) {
            sequence = (sequence + 1) & MAX_SEQUENCE;
            if (sequence == 0) {
                currentTimestamp = waitUntilNextTime(lastTimestamp);
            }
        } else {
            sequence = 0;
        }
        lastTimestamp = currentTimestamp;
        return ((currentTimestamp - BEGIN_TIMESTAMP) << TIMESTAMP_LEFT_SHIFT)
                | (dataCenterId << DATA_CENTER_LEFT_SHIFT)
                | (machineId << MACHINE_LEFT_SHIFT)
                | sequence;
    }
    
    /**
     * 等待下一毫秒
     * @param lastTimestamp 最后生成id的时间戳
     * @return 下一毫秒的时间戳
     */
    private long waitUntilNextTime(long lastTimestamp) {
        long time = System.currentTimeMillis();
        while (time <= lastTimestamp) {
            time = System.currentTimeMillis();
        }
        return time;
    }
}

四、使用场景

雪花算法id适用于需要生成全局唯一id的场景,比如订单号、用户id等。在分布式场景下,也可以用于解决单个节点出现的并发问题。

五、总结

通过对雪花算法id的深入介绍,相信大家对它有了更深入的了解。在开发过程中,如果需要生成全局唯一id,可以考虑使用雪花算法id。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/239851.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-12 12:18
下一篇 2024-12-12 12:18

相关推荐

  • 蝴蝶优化算法Python版

    蝴蝶优化算法是一种基于仿生学的优化算法,模仿自然界中的蝴蝶进行搜索。它可以应用于多个领域的优化问题,包括数学优化、工程问题、机器学习等。本文将从多个方面对蝴蝶优化算法Python版…

    编程 2025-04-29
  • Python实现爬楼梯算法

    本文介绍使用Python实现爬楼梯算法,该算法用于计算一个人爬n级楼梯有多少种不同的方法。 有一楼梯,小明可以一次走一步、两步或三步。请问小明爬上第 n 级楼梯有多少种不同的爬楼梯…

    编程 2025-04-29
  • AES加密解密算法的C语言实现

    AES(Advanced Encryption Standard)是一种对称加密算法,可用于对数据进行加密和解密。在本篇文章中,我们将介绍C语言中如何实现AES算法,并对实现过程进…

    编程 2025-04-29
  • Harris角点检测算法原理与实现

    本文将从多个方面对Harris角点检测算法进行详细的阐述,包括算法原理、实现步骤、代码实现等。 一、Harris角点检测算法原理 Harris角点检测算法是一种经典的计算机视觉算法…

    编程 2025-04-29
  • 数据结构与算法基础青岛大学PPT解析

    本文将从多个方面对数据结构与算法基础青岛大学PPT进行详细的阐述,包括数据类型、集合类型、排序算法、字符串匹配和动态规划等内容。通过对这些内容的解析,读者可以更好地了解数据结构与算…

    编程 2025-04-29
  • 瘦脸算法 Python 原理与实现

    本文将从多个方面详细阐述瘦脸算法 Python 实现的原理和方法,包括该算法的意义、流程、代码实现、优化等内容。 一、算法意义 随着科技的发展,瘦脸算法已经成为了人们修图中不可缺少…

    编程 2025-04-29
  • 神经网络BP算法原理

    本文将从多个方面对神经网络BP算法原理进行详细阐述,并给出完整的代码示例。 一、BP算法简介 BP算法是一种常用的神经网络训练算法,其全称为反向传播算法。BP算法的基本思想是通过正…

    编程 2025-04-29
  • 粒子群算法Python的介绍和实现

    本文将介绍粒子群算法的原理和Python实现方法,将从以下几个方面进行详细阐述。 一、粒子群算法的原理 粒子群算法(Particle Swarm Optimization, PSO…

    编程 2025-04-29
  • Python回归算法算例

    本文将从以下几个方面对Python回归算法算例进行详细阐述。 一、回归算法简介 回归算法是数据分析中的一种重要方法,主要用于预测未来或进行趋势分析,通过对历史数据的学习和分析,建立…

    编程 2025-04-28
  • 象棋算法思路探析

    本文将从多方面探讨象棋算法,包括搜索算法、启发式算法、博弈树算法、神经网络算法等。 一、搜索算法 搜索算法是一种常见的求解问题的方法。在象棋中,搜索算法可以用来寻找最佳棋步。经典的…

    编程 2025-04-28

发表回复

登录后才能评论