c++实现的唯一ID生成器
生活随笔
收集整理的這篇文章主要介紹了
c++实现的唯一ID生成器
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
設計背景
用作游戲服務器給每個角色生成UID,給物品生成唯一ID,有多個服務器類型,例如:游戲服,中心服,網關服等等;每個類型的服務器有多個,比如10個游戲服,20個網關服等
設計思想?
1. 思路參考雪花算法,即多個字段拼接成一個64位的數字
2. 最高位不用,4位服務器類型,7位服務器ID,32位時間戳,20位自增ID
3. 服務器類型占4位,所以有2的4次方,即16種不同的服務器類型
4. 服務器ID占7位,所以有2的7次方,即同一類型的服務器最多可以有128個
5. 時間戳占32位,精確到秒
6. 自增ID占20位,即2的20次方,每秒最多產生1048576個唯一ID
備注
使用時可以根據實際情況修改各個字段的占位數
代碼下載地址:
windows版: https://download.csdn.net/download/yzf279533105/11955287
運行結果如下圖(實驗時只產生了一次UID,并打印出來):
代碼如下:
使用代碼:
int main() {// 使用前先初始化IDGenerate::getSingleton().Init(ST_GAME,1);// 使用uint64_t uid = IDGenerate::getSingleton().GenerateUID();cout<<uid<<endl;getchar();return 0; }頭文件
* All rights reserved. * 文件名稱: IDGenerate.h * 作 者: yzf * 摘 要: UID生成器 * 目前規則:1位保留 + 4位服務器類型 + 7位服務器ID + 32位時間戳 + 20位自增ID * 每秒可以生產2的20次方,也就是1048576個UID * 使用前需先初始化,否則返回0(也可以在GenerateUID()內部判斷,若未初始化,則進行初始化,這樣接口更少) * 完成日期: 2019-11-3 ********************************************************************/#ifndef __ID_GENERATE_H__ #define __ID_GENERATE_H__#include <stdio.h> #include "define.h" #include "singleton.h"//class IDGenerate : public Singleton<IDGenerate> { public:IDGenerate();virtual ~IDGenerate(); public:// 生成一個全局唯一的UIDuint64_t GenerateUID();/**@purpose : 初始化@param serverType : 服務器類型@param serverID : 服務器ID*/void Init(SERVER_TYPE serverType, int serverID); protected:bool m_bInit; // 是否已初始化SERVER_TYPE m_serverType; // 服務器類型int m_serverID; // 服務器ID,同一類型的服務器中需唯一int m_lastSecond; // 上次產生ID時的時間戳,單位:秒int m_addID; // 自增ID };源文件
#include <time.h> #include "IDGenerate.h"// IDGenerate::IDGenerate() {m_bInit = false;m_addID = 0; }// IDGenerate::~IDGenerate() { }// 生成一個全局唯一的UID uint64_t IDGenerate::GenerateUID() {if (!m_bInit){printf("IDGenerate::GenerateUID(), m_bInit = false !!!!!");return 0;}// 當前時間unsigned int curSecond = time(NULL);// 若秒數不同了,則自增ID重新從0開始if(curSecond != m_lastSecond){m_lastSecond = curSecond;m_addID = 0;}return ((uint64_t)m_serverType<<59) + ((uint64_t)m_serverID<<52) + ((uint64_t)curSecond<<20) + ((uint64_t)m_addID++); }/** @purpose : 初始化 @param serverType : 服務器類型 @param serverID : 服務器ID */ void IDGenerate::Init(SERVER_TYPE serverType, int serverID) {m_serverType = serverType;m_serverID = serverID;m_bInit = true; }SINGLETON_INIT(IDGenerate)?
總結
以上是生活随笔為你收集整理的c++实现的唯一ID生成器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: map unordered_map ha
- 下一篇: c++实现时间轴,时间管理器