根据高分辨率的时钟为种子,生成指定长度的随机 ID 的函数
// 生成指定长度的随机 ID
std::string randomId(size_t length) {
using std::chrono::high_resolution_clock;
static thread_local std::mt19937 rng(
static_cast<unsigned int>(high_resolution_clock::now().time_since_epoch().count()));
static const std::string characters(
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");
std::string id(length, '0');
std::uniform_int_distribution<int> uniform(0, int(characters.size() - 1));
std::generate(id.begin(), id.end(), [&]() { return characters.at(uniform(rng)); });
return id;
}
using std::chrono::high_resolution_clock; // 这行代码引入了 `std::chrono::high_resolution_clock`,这是一个用于测量时间的标准库类。
static thread_local std::mt19937 rng(
static_cast<unsigned int>(high_resolution_clock::now().time_since_epoch().count()));
这行代码定义了一个静态局部变量
rng
,它是一个std::mt19937
类型的伪随机数生成器。通过使用当前时间的高分辨率时钟的计数作为种子,我们创建了一个每次函数调用时都会生成不同随机数序列的生成器。static const std::string characters(
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");
这行代码定义了一个静态常量字符串
characters
,它包含了用于生成随机 ID 的字符集。它包括数字、大写字母和小写字母。std::string id(length, '0');
这行代码创建了一个名为
id
的std::string
对象,长度为length
,并将其初始化为由字符'0'
组成的字符串。std::uniform_int_distribution<int> uniform(0, int(characters.size() - 1));
这行代码定义了一个均匀分布的整数生成器
uniform
,它生成范围在0
到characters.size() - 1
之间的整数。std::generate(id.begin(), id.end(), [&]() { return characters.at(uniform(rng)); });
这行代码使用
std::generate
算法,将随机选择的字符填充到id
字符串中。generate
函数接受一个范围(由id.begin()
和id.end()
表示),并使用 lambda 表达式作为生成器函数。lambda 表达式使用characters
字符串和uniform(rng)
生成的随机索引来填充字符。