dl
dl_guid.h
浏览该文件的文档.
1
13#pragma once
14
15#include <array>
16
17#include "dl_type.h"
18#include "math/dl_math.h"
19#include "system/dl_time.h"
20
21namespace dl
22{
23 using Uid = uint64_t;
24 using Guid = std::array<uint64_t, 2>;
25
27 constexpr uint8_t UID_STEP = 16;
29 constexpr uint64_t UID_YEAR_SECOND_X = 366ull * 24ull * 60ull * 60ull * UID_STEP;
31 constexpr uint8_t UID_YEAR = 100;
33 constexpr uint8_t UID_BIT_USER = 8;
35 constexpr uint8_t UID_BIT_TIME = 40;
37 constexpr uint64_t UID_STEP_COUNT = Math::Pow64(2, 64 - UID_BIT_TIME - UID_BIT_USER);
39 constexpr uint64_t UID_POW_2_X = Math::Pow64(2, UID_BIT_TIME);
40
43 {
44 public:
46 static void Init(time_t t_start, uint64_t user)
47 {
48 static_assert(UID_YEAR_SECOND_X * UID_YEAR < UID_POW_2_X);
49 _tStart = t_start;
50 _user = user;
51 }
52 static Uid CreateUid()
53 {
54 redo:
55 time_t t = Time::GetTimeStampMs();
56 time_t t_cur = t - _tStart;
57 // 同一秒
58 if (t_cur == _tCur)
59 {
60 if (_i + 1 == 0)
61 {// 越界
62 log_warn("短时间生成uid过多,即将阻塞等待!");
64 goto redo;
65 }
66 else
67 return _make();
68 }
69 else
70 {
71 _tCur = t_cur;
72 _i = 0;
73 return _make();
74 }
75 }
76 private:
77 static time_t _tStart;
78 static time_t _tCur;
79 static uint32_t _i;
80 static uint64_t _user;
81
82 static uint64_t _make()
83 {
84 return (_user << (64 - UID_BIT_USER))
85 | ((uint64_t)_tCur << (64 - UID_BIT_TIME - UID_BIT_USER))
86 | ((uint64_t)_i++);
87 }
88 };
89}
90
static void Sleep(unsigned t=0)
阻塞线程毫秒数(不精确)
static time_t GetTimeStampMs()
返回时间戳(毫秒)
uid生成器
static void Init(time_t t_start, uint64_t user)
设置起始点时间戳(可以不调用)
static Uid CreateUid()
#define log_warn(...)
数学相关的通用算法
时间相关
通用类型
constexpr uint64_t Pow64(uint64_t x, uint8_t n)
constexpr uint64_t UID_POW_2_X
时间戳占据位数能表示的上限
std::array< uint64_t, 2 > Guid
constexpr uint8_t UID_YEAR
需要支持多少年
uint64_t Uid
constexpr uint8_t UID_STEP
单步生成时间(毫秒)
constexpr uint64_t UID_YEAR_SECOND_X
一年生成的数量
constexpr uint64_t UID_STEP_COUNT
单步最大数量
constexpr uint8_t UID_BIT_TIME
时间戳占据位数
constexpr uint8_t UID_BIT_USER
自定义数据位数