MantisBase v0.3.4
Loading...
Searching...
No Matches
uuidv7.h
Go to the documentation of this file.
1
9#ifndef MANTISAPP_UUIDV7_H
10#define MANTISAPP_UUIDV7_H
11
12#include <array>
13#include <chrono>
14#include <iomanip>
15#include <iostream>
16#include <random>
17#include <sstream>
18#include <string>
19#include <cstdint>
20#include <mutex>
21
22namespace mb {
23 inline uint64_t now_unix_ms() {
24 using namespace std::chrono;
25 return static_cast<uint64_t>(duration_cast<milliseconds>(system_clock::now().time_since_epoch()).count());
26 }
27
28 inline std::string to_hex_lower(const std::array<uint8_t,16>& b) {
29 std::ostringstream ss;
30 ss << std::hex << std::setfill('0');
31 for (size_t i = 0; i < 16; ++i) {
32 ss << std::setw(2) << static_cast<int>(b[i]);
33 if (i == 3 || i == 5 || i == 7 || i == 9) ss << '-';
34 }
35 return ss.str();
36 }
37
38 inline std::string generate_uuidv7() {
39 thread_local std::mt19937_64 rng((std::random_device{})());
40 thread_local uint64_t last_ts = 0;
41 thread_local uint16_t counter = 0;
42
43 const uint64_t ts_ms = now_unix_ms() & 0x0000FFFFFFFFFFFFULL; // 48 bits
44
45 if (ts_ms == last_ts) {
46 ++counter;
47 } else {
48 last_ts = ts_ms;
49 counter = 0;
50 }
51
52 // 12-bit random or counter value (rand_a)
53 const uint16_t rand12 = counter & 0x0FFF; // 12 bits, wraps automatically
54
55 // 62-bit random (rand_b)
56 std::uniform_int_distribution<uint64_t> dist62(0, ( (1ULL<<62) - 1 ));
57 const uint64_t rand62 = dist62(rng);
58
59 std::array<uint8_t,16> bytes{};
60 for (int i = 0; i < 6; ++i)
61 bytes[i] = static_cast<uint8_t>((ts_ms >> (8*(5-i))) & 0xFF);
62
63 bytes[6] = static_cast<uint8_t>((7u << 4) | ((rand12 >> 8) & 0x0F)); // version 7
64 bytes[7] = static_cast<uint8_t>(rand12 & 0xFF);
65
66 bytes[8] = static_cast<uint8_t>(0x80 | ((rand62 >> 56) & 0x3F)); // variant
67 for (int i = 0; i < 7; ++i)
68 bytes[9 + i] = static_cast<uint8_t>((rand62 >> (48 - 8*i)) & 0xFF);
69
70 return to_hex_lower(bytes);
71 }
72}
73
74#endif //MANTISAPP_UUIDV7_H
router.h
Definition auth.h:15
uint64_t now_unix_ms()
Definition uuidv7.h:23
std::string generate_uuidv7()
Definition uuidv7.h:38
std::string to_hex_lower(const std::array< uint8_t, 16 > &b)
Definition uuidv7.h:28