雪花算法的原理生成一个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;
2
用到的时间的结构体:
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。觉得一毫秒个数不够用也可以调大点,