网游服务器中的GUID(唯一标识码)实现-基于snowflake算法
来源:互联网 发布:马蓉 长相知乎 编辑:程序博客网 时间:2024/05/22 16:07
网游服务器中的GUID(唯一标识码)实现-基于snowflake算法
本文中的算法采用twitter的snowflake算法,具体请搜索介绍,原来是用Scala写的,因我项目需要,改写成C++语言,主要用于高效的生成唯一的ID, 核心算法就是毫秒级时间(41位)+机器ID(10位)+毫秒内序列(12位).
网上也有好多PHP写的插件模块,核心用了网络通讯将生成的ID发送给PHP使用,没深入研究PHP的模块写法。
废话不多说了,还是直接上代码好了。
uuid.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#ifndef __UTIL_UUID_H__
#define __UTIL_UUID_H__
#include <stdint.h>
namespace utils
{
// twitter snowflake算法
// 64 63--------------22---------12---------0
// 符号位 | 41位时间 |10位机器码|12位自增码|
extern uint64_t get_time();
class unique_id_t
{
public:
unique_id_t();
~unique_id_t();
void set_epoch(uint64_t epoch);
void set_machine(int32_t machine);
int64_t generate();
private:
uint64_t epoch_;
uint64_t time_;
int32_t machine_;
int32_t sequence_;
};
}
#endif // !__UTIL_UUID_H__
uuid.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include "uuid.h"
#if defined(__GUNC__)
#include <sys/time.h>
#include <unistd.h>
#define EPOCHFILETIME 11644473600000000ULL
#else
#include <windows.h>
#include <time.h>
#define EPOCHFILETIME 11644473600000000Ui64
#endif
namespaceutils
{
uint64_tget_time()
{
#ifdef __GUNC__
structtimevaltv;
gettimeofday(&tv,NULL);
uint64time=tv.tv_usec;
time/=1000;
time+=(tv.tv_sec*1000);
returntime;
#else
FILETIMEfiletime;
uint64_ttime=0;
GetSystemTimeAsFileTime(&filetime);
time|=filetime.dwHighDateTime;
time<<=32;
time|=filetime.dwLowDateTime;
time/=10;
time-=EPOCHFILETIME;
returntime/1000;
#endif
}
unique_id_t::unique_id_t()
{
epoch_=0;
time_=0;
machine_=0;
sequence_=0;
}
unique_id_t::~unique_id_t()
{
}
voidunique_id_t::set_epoch(uint64_tepoch)
{
epoch_=epoch;
}
voidunique_id_t::set_machine(int32_tmachine)
{
machine_=machine;
}
int64_tunique_id_t::generate()
{
int64_tvalue=0;
uint64_ttime=get_time()-epoch_;
// 保留后41位时间
value=time<<22;
// 中间10位是机器ID
value|=(machine_&0x3FF)<<12;
// 最后12位是sequenceID
value|=sequence_++&0xFFF;
if(sequence_==0x1000)
{
sequence_=0;
}
returnvalue;
}
}
#ifdef __TEST__
#include <iostream>
voidtest()
{
utils::unique_id_t*u_id_ptr=newutils::unique_id_t();
u_id_ptr->set_epoch(uint64_t(1367505795100));
u_id_ptr->set_machine(int32_t(100));
for(inti=0;i<1024;++i)
{
std::cout<<u_id_ptr->generate()<<std::endl;;
}
}
#endif
这样的唯一ID就可以用来表示你系统中使用的例如物品唯一ID,坐骑唯一ID等等数据,方便记录和追踪。
阅读全文
0 0
- 网游服务器中的GUID(唯一标识码)实现-基于snowflake算法
- sqlserver 中的GUID 全局唯一标识
- sqlserver 中的GUID 全局唯一标识
- 全球唯一标识GUID
- Guid 唯一标识
- guid(cid)唯一标识
- 分布式高并发下唯一标识snowflake算法
- 数据库GUID、INT唯一标识
- C++获取全球唯一标识号GUID
- 唯一编号算法:生成GUID
- 基于业务对Twitter生成全局唯一ID的SnowFlake算法的改造
- UidGenerator:百度出品的基于 Snowflake 算法的唯一 ID 生成器(Java)
- UidGenerator:百度出品的基于 Snowflake 算法的唯一 ID 生成器
- 基于snowflake算法实现了一个Sequence的Rest服务
- C# 实现 Snowflake算法
- C语言实现分布式自增有序的唯一ID生成算法-snowflake算法
- C语言实现分布式自增有序的唯一ID生成算法-snowflake算法
- PHP使用SnowFlake算法生成唯一ID
- 实用便捷的热修复—bugly:tinker
- 【必读干货】半小时颠覆你对Java单例的认知?
- AFNetworking3.1 基本使用
- java--for循环之水仙花数问题
- POJ 1144 Network (割顶)
- 网游服务器中的GUID(唯一标识码)实现-基于snowflake算法
- html到pdf图片链接路径问题 openhtmltopdf
- 网页注册会员
- java Excel 填充单元格
- 磁力机航向角计算与补偿
- JavaScript返回上一页的三种方法
- springMVC restful实现
- 文章标题
- JNI for Android, Android Studio NDK 入门 实例 demo