c++标准库至今无std::uuid;跨平台推荐boost的boost::uuids::random_generator,linux可选libuuid,windows用cocreateguid;mysql存uuid应使用binary(16)而非字符串以避免性能问题。

用 std::uuid?C++ 标准库里根本没有这个东西
别被网上“C++17 引入 std::uuid”的误传骗了——C++23 也没加,标准库至今零 UUID 支持。所有声称“原生支持”的代码,要么是编译器扩展(如 MSVC 的 __uuidof,但只用于 COM 类型),要么是第三方头文件伪装成标准库。
实操建议:
立即学习“C++免费学习笔记(深入)”;
- 别搜
std::uuid,它不存在;搜boost::uuids::uuid或libuuid才靠谱 - 如果项目已用 Boost,优先选
boost::uuids::random_generator,跨平台、线程安全、无外部依赖 - Linux 环境下若想轻量,可用系统
libuuid(#include <uuid></uuid>),但注意:Windows 没这玩意,得自己带 .dll 或换方案
用 Boost 生成 v4 UUID:三步写完,但默认不带短横线
Boost 的 boost::uuids::to_string() 返回的是纯 32 字符十六进制串(如 "550e8400e29b41d4a716446655440000"),不是常见的带短横线格式("550e8400-e29b-41d4-a716-446655440000")。这点容易在日志或 API 交互时出错。
实操建议:
立即学习“C++免费学习笔记(深入)”;
- 生成:用
boost::uuids::random_generator,不是name_generator(那是 v3/v5,要输名字) - 格式化:手动插入短横线,或用
boost::uuids::to_string(u)后正则替换,别信某些博客说“加个 flag 就行”——没这 flag - 注意
boost::uuids::uuid对象本身不能直接std::cout,得先转std::string,否则编译失败
boost::uuids::random_generator gen; boost::uuids::uuid u = gen(); std::string s = boost::uuids::to_string(u); // "550e8400e29b41d4a716446655440000" // 要带短横线?自己切片拼接或用 std::regex_replace
不用 Boost 怎么办?Linux 下调 libuuid 最快,但 Windows 需备选
libuuid 是 Linux 发行版标配,函数极简:uuid_generate_random() + uuid_unparse()。但它在 Windows 上根本不可用——连头文件都没有。硬要跨平台,就得条件编译,或者直接放弃。
实操建议:
立即学习“C++免费学习笔记(深入)”;
- Linux-only 项目:直接用
uuid_t+uuid_generate_random(),比 Boost 启动更快、二进制更小 - Windows-only:用
CoCreateGuid()(需#include <guiddef.h></guiddef.h>和ole32.lib),返回GUID,再转字符串时注意字节序(StringFromCLSID会自动处理) - 混用风险:别把
libuuid生成的字符串和CoCreateGuid的字符串当同一格式互认——前者小端,后者 COM GUID 默认大端显示,实际值一致,但人眼比对易翻车
UUID 当主键?小心 MySQL 的 ORDER BY 性能崩掉
UUID 做数据库主键很常见,但 C++ 生成后直接插 MySQL,如果字段类型是 CHAR(36) 或 VARCHAR(36),索引会因随机性变稀疏,ORDER BY id 几乎没法走范围扫描,查询一多就慢。
实操建议:
立即学习“C++免费学习笔记(深入)”;
- MySQL 里存 UUID 别用字符串,改用
BINARY(16),用UUID_TO_BIN()入库、BIN_TO_UUID()查询 - C++ 侧生成后,别直接塞字符串进 SQL,先 hex-decode 成 16 字节数组(
boost::uuids::uuid可用.begin()拿原始数据) - 别忽略时钟回拨风险:v1 UUID 依赖时间戳,若系统时间被手动调后,可能生成重复值;v4 随机生成,更稳妥










