简介本文向大家介绍一个C++实战项目:C++实现雪花算法(SnowFlake)产生唯一ID,主要涉及雪花算法、算法知识等,具有一定的C++实战价值,感兴趣的朋友可以参考一下。
SnowFlake 中文意思为雪花,故称为雪花算法。最早是 Twitter 公司在其内部用于分布式环境下生成唯一 ID。在2014年开源 scala 语言版本。
雪花算法的原理就是生成一个的 64 位比特位的 long 类型的唯一ID。
总的来说就是一个机房,一台机器,在同一号毫秒时产生的ID,可能在同一秒钟产生不同的ID,最后12bit序列号可以区分在同一秒钟的不同ID。
雪花算法有以下几个优点:
使用VS2015创建一个名为“SnowFlakeTest”Win32工程,并编写测试代码:
// SnowFlakeTest.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "SnowFlake.h"
#include <iostream>
using namespace std;
int main(int argc, char const *argv[])
{
SnowFlake snow;
snow.SetMechine(1024);
for (int i = 0; i < 1000; ++i)
{
cout << snow.UniqueId() << endl;
}
return 0;
}
SnowFlake.h文件:
class SnowFlake
{
public:
SnowFlake()
{
m_seqMask = ~(-1L << 10);
m_lasttm = TimeMs();
}
virtual ~SnowFlake() {}
int64_t UniqueId();
int64_t TimeMs();
int64_t PId();
void SetMechine(int64_t mechine)
{
m_mechine = mechine;
}
int64_t NextMs(int64_t now);
private:
int64_t m_seq{ 0 };
int64_t m_mechine;
int64_t m_lasttm{ -1L };
int64_t m_seqMask;
int64_t m_epoch{ 1546272000000L }; // 起始时间戳 2019-01-01
};
核心算法代码:
int64_t SnowFlake::UniqueId()
{
int64_t now = TimeMs();
if (now == m_lasttm)
{
m_seq = (m_seq + 1) & m_seqMask;
if (m_seq == 0)
{
now = NextMs(now);
}
}
else
{
m_seq = 0; //最大为1024
}
m_lasttm = now;
int64_t pid = PId();
int64_t uid = (now - m_epoch) << 22 | m_mechine << 16 | pid << 10 | m_seq;
return uid;
}
运行结果:
本文介绍一个C++代码片段:如何在C++中删除一个文件目录下的所有文件及目录,感兴趣的朋友可以参考一下。
本文介绍C++实现C++实现8种排序算法,主要包括冒泡排序、插入排序、二分插入排序、希尔排序、直接选择排序、堆排序、归并排序、快速排序,直接上代码,感兴趣的朋友可以参考一下。
本文介绍C++实现线程同步的四种方式:事件对象、互斥对象、临界区、信号量,感兴趣的朋友可以参考一下。
本文介绍C++内存泄漏的检测与定位方法,感兴趣的朋友可以参考一下。
本文向大家介绍一个C++实战项目:C++实现一个多线程安全的队列容器模板类,主要涉及C++模板类的使用、互斥体实现多线程安全、队列数据结构等知识,具有一定的C++实战价值,感兴趣的朋友可以参考一下。
本文实现C++中UTF-8与GB2312相互转换,感兴趣的朋友可以参考一下。