雪花算法的介绍及实现

本文介绍了雪花算法,它是一个生成64位唯一ID的算法,常用于分布式系统。该算法随机性好,使用chrono模板库计时。其特点包括依赖服务器时间、ID单调递增等。ID有效部分含41位时间戳、10位机器码和12位序号,可避免重复ID。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

雪花算法的原理生成一个64位的唯一ID生成算法。常见的rand生成的是伪随机数,雪花算法生成的数的随机性很好,通常在分布式系统中生成唯一ID。

该算法中用到的模板库:

时间计时器:chrono

 std::chrono::system_clock:  依据系统的当前时间 (不稳定)
 std::chrono::steady_clock:  以统一的速率运行(不能进行调整)
 std::chrono::high_resolution_clock: 提供最高精度的计时周期(可能是steady_clock或者system_clock的typedef)

1 duration_cast()函数提供了在不同的时间单位之间进行转换的功能

   std::chrono::duration_cast<std::chrono::milliseconds>();可以将获取到的时间转换成毫秒

std::chrono::seconds             c7(1);               //1秒
std::chrono::milliseconds        c8(1*1000);          //1000毫秒;1s
std::chrono::microseconds        c9(1*1000*1000);     //1000*1000微秒 1s
std::chrono::nanoseconds         c10(1*1000*1000*1000);//1000*1000*1000纳秒 1s;

用到的时间的结构体:

struct timeval {
time_t tv_sec;    // seconds 
long tv_usec;    // microseconds 
};


 

//获取系统的当前时间 auto t = system_clock::now();

雪花算法的一些特点:

        1  依赖服务器时间,服务器时钟回拨时可能会生成重复 id。算法中可通过记录最后一个生成 id 时的时间戳来解决,每次生成 id 之前比较当前服务器时钟是否被回拨,避免生成重复 id。

        2 ID单调递增

        基于时间戳,以及同一时间戳下序列号自增,基本保证 id 有序递增

        3 不依赖第三方库或者中间件,可直接通过编译,执行也不需要其他东西 的支持。

        4 算法简单,在内存中进行,效率高。​​​​​​​        ​​​​​​​ 

算法中ID的有效部分有三个       ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​

 时间戳:

41位时间戳部分:此部分是雪花算法的关键部分(是固定的41位),因为时间是唯一且单调递增的,以时间作为关键部分,理论上ID便不会重复(但计算机上的时间计量却可能不是唯一且单调递增的,存在时间回跳或前跳现象),时间戳精度为毫秒

10位机器码:事先配置好的机器ID,也表示最多可以有1024个机器同时产出ID

12位序号:12-bit位是自增序列,也标明1台机器1ms中最多产生4096个ID。觉得一毫秒个数不够用也可以调大点,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值