70inline std::string
uniqid(
const bool moreEntropy)
72 const auto now = std::chrono::system_clock::now();
73 const auto epoch = now.time_since_epoch();
74 const auto us_since_epoch = std::chrono::duration_cast<std::chrono::microseconds>(epoch).count();
79 const auto sec =
static_cast<uint32_t
>(us_since_epoch / 1'000'000);
80 const auto usec =
static_cast<uint32_t
>(us_since_epoch % 1'000'000);
81 std::string result = std::format(
"{:08x}{:05x}", sec, usec);
87 thread_local auto rng = std::mt19937{ std::random_device{}() };
88 auto f_dist = std::uniform_real_distribution<double>(0.0, 10.0);
91 result = result + std::format(
"{:.8f}", f_dist(rng));
101inline std::string
v4()
113 std::array<uint8_t, 16> bytes;
116 thread_local auto rng = std::mt19937{ std::random_device{}() };
117 auto dist = std::uniform_int_distribution<uint32_t>(0, 0xFF);
120 for (
auto &
byte : bytes)
121 byte =
static_cast<uint8_t
>(dist(rng));
124 bytes[6] =
static_cast<uint8_t
>((bytes[6] & 0x0F) | 0x40);
127 bytes[8] =
static_cast<uint8_t
>((bytes[8] & 0x3F) | 0x80);
130 std::ostringstream oss;
131 oss << std::hex << std::nouppercase << std::setfill(
'0');
132 for (
int i = 0; i < 16; ++i)
134 oss << std::setw(2) << static_cast<int>(bytes[i]);
135 if (i == 3 || i == 5 || i == 7 || i == 9)
145inline std::string
v7()
158 std::array<uint8_t, 16> bytes;
161 thread_local auto rng = std::mt19937{ std::random_device{}() };
162 auto dist = std::uniform_int_distribution<uint32_t>(0, 0xFF);
164 const auto now = std::chrono::system_clock::now();
165 const auto epoch = now.time_since_epoch();
166 const uint64_t ms_since_epoch = std::chrono::duration_cast<std::chrono::milliseconds>(epoch).count();
169 bytes[0] =
static_cast<uint8_t
>((ms_since_epoch >> 40) & 0xFF);
170 bytes[1] =
static_cast<uint8_t
>((ms_since_epoch >> 32) & 0xFF);
171 bytes[2] =
static_cast<uint8_t
>((ms_since_epoch >> 24) & 0xFF);
172 bytes[3] =
static_cast<uint8_t
>((ms_since_epoch >> 16) & 0xFF);
173 bytes[4] =
static_cast<uint8_t
>((ms_since_epoch >> 8) & 0xFF);
174 bytes[5] =
static_cast<uint8_t
>(ms_since_epoch & 0xFF);
177 for (
size_t i = 6; i < 16; ++i)
178 bytes[i] =
static_cast<uint8_t
>(dist(rng));
181 bytes[6] =
static_cast<uint8_t
>((bytes[6] & 0x0F) | 0x70);
184 bytes[8] =
static_cast<uint8_t
>((bytes[8] & 0x3F) | 0x80);
187 std::ostringstream oss;
188 oss << std::hex << std::nouppercase << std::setfill(
'0');
189 for (
int i = 0; i < 16; ++i)
191 oss << std::setw(2) << static_cast<int>(bytes[i]);
192 if (i == 3 || i == 5 || i == 7 || i == 9)