首页 > 其他分享 >Snowflake 分布式id生成器--生成唯一ID

Snowflake 分布式id生成器--生成唯一ID

时间:2024-03-20 19:34:24浏览次数:28  
标签:-- timestamp 生成器 lastTimestamp long ID 生成 Snowflake

在 Snowflake 算法中,通常包含以下几个部分来构造一个唯一的 ID:

  1. 时间戳(Timestamp):占据了 64 位 ID 中的高 41 位,用来表示生成 ID 的时间。通过时间戳的递增,保证了生成的 ID 是递增且唯一的。

  2. 数据中心 ID(Data Center ID):用于标识不同的数据中心,通常占据了 5 位。

  3. 机器 ID(Worker ID):用于标识同一数据中心下的不同机器,也通常占据了 5 位。

  4. 序列号(Sequence Number):用来保证同一毫秒内生成的多个 ID 的唯一性,通常占据了 12 位。

Snowflake 算法的构造一般是这样的:

  1. 初始化:传入数据中心 ID 和机器 ID,初始化 Snowflake 实例时会生成一个开始时间戳(通常是指定一个固定的起始时间)。

  2. 生成 ID:在生成 ID 的时候,根据当前时间戳、数据中心 ID、机器 ID 和序列号生成一个 64 位的唯一 ID。

在 C++ 中,你可以定义一个 Snowflake 类,包含合适的成员变量和方法,以实现 Snowflake 算法。以下是一个简单的示例:

 

#include <iostream>
#include <chrono>
#include <thread>

class Snowflake {
private:
    int dataCenterId;
    int workerId;
    long long sequence;
    long long lastTimestamp;

public:
    Snowflake(int dataCenterId, int workerId) : dataCenterId(dataCenterId), workerId(workerId), sequence(0), lastTimestamp(-1) {}

    long long generateId() {
        long long timestamp = getCurrentTimestamp();

        if (timestamp < lastTimestamp) {
            // 时间回退,抛出异常或者等待直到时间追上
            throw std::runtime_error("Clock moved backwards. Refusing to generate id.");
        }

        if (timestamp == lastTimestamp) {
            sequence = (sequence + 1) & 0xFFF; // 序列号取值范围为0~4095
            if (sequence == 0) {
                timestamp = waitNextMillis(lastTimestamp);
            }
        } else {
            sequence = 0;
        }

        lastTimestamp = timestamp;

        return ((timestamp - 1609459200000) << 22) | (dataCenterId << 17) | (workerId << 12) | sequence;
    }

private:
    long long getCurrentTimestamp() {
        return std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();
    }

    long long waitNextMillis(long long lastTimestamp) {
        long long timestamp = getCurrentTimestamp();
        while (timestamp <= lastTimestamp) {
            timestamp = getCurrentTimestamp();
        }
        return timestamp;
    }
};

int main() {
    Snowflake snowflake(1, 1); // 数据中心ID为1,机器ID为1

    for(int i=0;i<100;i++){
        long long uniqueId = snowflake.generateId();
        std::cout << "Generated unique ID: " << uniqueId << std::endl<<std::flush;
    }
    return 0;
}

在这个示例中,generateId 方法根据当前时间戳、数据中心 ID、机器 ID 和序列号生成唯一的 ID。getCurrentTimestamp 方法获取当前的毫秒级时间戳,waitNextMillis 方法用来等待直到时间追上。整个 Snowflake 类实现了一个简单的 Snowflake 算法生成唯一 ID。

标签:--,timestamp,生成器,lastTimestamp,long,ID,生成,Snowflake
From: https://www.cnblogs.com/music-liang/p/18085911

相关文章

  • Spring boot2.7整合jetcache方法缓存 处理数据发生变化时同步更新缓存 删除缓存操作
    上文Springboot2.7整合jetcache方法缓存我们做了个方法缓存的案例可以将接口内容缓存起来是能大大提高效率的但是我们接口的数据大多来自数据库如果我们调用增删查改它的数据变化了那缓存的内容就会因为没有及时更新变的不准确例如我们这样我们在上面定义了......
  • HarmonyOS 通知意图
    之前的文章我们讲了harmonyos中的基础和进度条通知那么今天我们来说说任何给通知添加意图通知意图简单说就是当我们点击某个通知如下图然后就会拉起某个应用就例如说我们某个微信好友发消息给我们我们点击系统通知可以直接跳到你们的聊天界面好回......
  • Spring boot2.7整合jetcache方法缓存
    前面的文章我们讲了springboot整合jetcache做基本字符串数据缓存但是我这里有个这样的逻辑我的domain包下有一个book属性类里面就id和name属性设置了对应的setget函数和一个整体的构造函数packagecom.example.javadom.domain;publicclassboo......
  • Uboot命令的使用
    学习资料:https://www.bilibili.com/video/BV12E411h71h?p=6&vd_source=432ba293ecfc949a4174ab91ccc526d6https://blog.csdn.net/x777777x/article/details/136444785 记录一次uboot启动log打印:U-Boot2016.03(Mar182024-01:07:08+0800)//编译时间2024/03/180......
  • 你真的了解c语言的10大字符串函数吗?
    乐观学习,乐观生活,才能不断前进啊!!!我的主页:optimistic_chen我的专栏:c语言点击主页:optimistic_chen和专栏:c语言,创作不易,大佬们点赞鼓励下吧~前言:长度不受限制的字符串函数-strcpy,strcat,strcmp长度受限制的字符串函数-strncpy,strncat,strncmp文章目录前言:1.st......
  • 讲述微信小程序 通信模型
    之前的文章讲述微信小程序宿主环境我们讲到了手机微信为小程序提供了多方面支持包括1通讯模型2运行机制3组件4API今天我们就来说通讯模型小程序中的通信主题是渲染层和逻辑层首先渲染层中包含的是wxml页面模板和wxss样式逻辑层里面则都是js......
  • 性能指标
             ......
  • 芒果YOLOv5改进86:上采样Dysample:顶会ICCV2023,轻量级图像增采样器,通过学习采样来学习上
    ......
  • 字符串函数
    这些字符串函数一定加头文件#include<string.h>strlen函数:1.它的功能:计算字符串的长度 2.strlen的实现:intmy_strlen(constchar*str){intcount=0;assert(str);while(*str){count++;str++;}returncount;}strcut函数:1.这个函数实现的是字......
  • NOJ南邮上机 矩阵变换问题 PROB1020 Python
    PROB1020   矩阵变换问题描述:给定一个 n×m的矩阵,对于 初始矩阵 中所有值为 1 的元素,重置其 所在行列 的所有元素为 0,最后输出整个修改后的矩阵。输入:输入共包含 1+n行。第一行包两个整数 n 和 m,分别表示矩阵的长和宽,题目保证 2≤n,m≤700且 4≤n×m......