日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

c++实现的唯一ID生成器

發(fā)布時間:2024/2/28 c/c++ 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++实现的唯一ID生成器 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

設計背景

用作游戲服務器給每個角色生成UID,給物品生成唯一ID,有多個服務器類型,例如:游戲服,中心服,網(wǎng)關(guān)服等等;每個類型的服務器有多個,比如10個游戲服,20個網(wǎng)關(guān)服等

設計思想?

1. 思路參考雪花算法,即多個字段拼接成一個64位的數(shù)字

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次方,每秒最多產(chǎn)生1048576個唯一ID

備注

使用時可以根據(jù)實際情況修改各個字段的占位數(shù)

代碼下載地址:

windows版: https://download.csdn.net/download/yzf279533105/11955287

運行結(jié)果如下圖(實驗時只產(chǎn)生了一次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生成器 * 目前規(guī)則:1位保留 + 4位服務器類型 + 7位服務器ID + 32位時間戳 + 20位自增ID * 每秒可以生產(chǎn)2的20次方,也就是1048576個UID * 使用前需先初始化,否則返回0(也可以在GenerateUID()內(nèi)部判斷,若未初始化,則進行初始化,這樣接口更少) * 完成日期: 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; // 上次產(chǎn)生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);// 若秒數(shù)不同了,則自增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)

?

總結(jié)

以上是生活随笔為你收集整理的c++实现的唯一ID生成器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。