在分布式系统中,需要生成全局UID的场合还是比较多的,twitter的snowflake解决了这种需求,实现也还是很简单的,除去配置信息,核心代码就是毫秒级时间41位+机器ID 10位+毫秒内序列12位。
网上也有好多PHP写的插件模块,核心用了网络通讯将生成的ID发送给PHP使用,没深入研究PHP的模块写法。
废话不多说了,还是直接上代码好了。
uuid.h
#ifndef __UTIL_UUID_H__
#define __UTIL_UUID_H__
#include
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
#include "uuid.h"
#if defined(__GUNC__)
#include
#include
#define EPOCHFILETIME 11644473600000000ULL
#else
#include
#include
#define EPOCHFILETIME 11644473600000000Ui64
#endif
namespace utils
{
uint64_t get_time()
{
#ifdef __GUNC__
struct timeval tv;
gettimeofday(&tv, NULL);
uint64 time = tv.tv_usec;
time /= 1000;
time += (tv.tv_sec * 1000);
return time;
#else
FILETIME filetime;
uint64_t time = 0;
GetSystemTimeAsFileTime(&filetime);
time |= filetime.dwHighDateTime;
time <<= 32;
time |= filetime.dwLowDateTime;
time /= 10;
time -= EPOCHFILETIME;
return time / 1000;
#endif
}
unique_id_t::unique_id_t()
{
epoch_ = 0;
time_ = 0;
machine_ = 0;
sequence_ = 0;
}
unique_id_t::~unique_id_t()
{
}
void unique_id_t::set_epoch(uint64_t epoch)
{
epoch_ = epoch;
}
void unique_id_t::set_machine(int32_t machine)
{
machine_ = machine;
}
int64_t unique_id_t::generate()
{
int64_t value = 0;
uint64_t time = get_time() - epoch_;
// 保留后41位时间
value = time << 22;
// 中间10位是机器ID
value |= (machine_ & 0x3FF) << 12;
// 最后12位是sequenceID
value |= sequence_++ & 0xFFF;
if (sequence_ == 0x1000)
{
sequence_ = 0;
}
return value;
}
}
#ifdef __TEST__
#include
void test()
{
utils::unique_id_t* u_id_ptr = new utils::unique_id_t();
u_id_ptr->set_epoch(uint64_t(1367505795100));
u_id_ptr->set_machine(int32_t(100));
for (int i = 0; i < 1024; ++i)
{
std::cout << u_id_ptr->generate() << std::endl;;
}
}
#endif
这样的唯一ID就可以用来表示你系统中使用的例如物品唯一ID,坐骑唯一ID等等数据,方便记录和追踪。
茶杯头甜蜜终章dlc 官方手机版v1.0.0.3
下载火柴人传说暗影格斗内置菜单 最新版v3.0.1
下载荒野乱斗测试服 安卓版v61.10.3
下载荒野乱斗彩虹服 安卓版v61.10.3
下载寒霜启示录 安卓版v1.25.10
寒霜启示录是一款生存模拟游戏,不少玩家可能对于末日都有着自己
末日城堡免广告版 安卓最新版v0.7.1
末日城堡免广告版是一款非常好玩的模拟经营类游戏,内部可以不看
甜蜜人生模拟器 最新版v1.4.5
甜蜜人生模拟器是一款非常好玩的模拟恋爱手游,玩家在这里能够对
武器锻造师内置功能菜单 v10.4
武器锻造师内置菜单版是游戏的破解版本,在该版本中为玩家提供了
开放空间overfield 安卓版v1.0.5
开放空间Overfield是一款箱庭养成经营手游,让你在广阔