libuuid(Linux/macOS)和 CoCreateGuid(Windows)是生成 RFC 4122 标准 UUID 的合规方案;需正确转换格式、检查空值、初始化 COM,并避免手写随机实现。

用 libuuid 生成标准 UUID(Linux/macOS)
Linux 和 macOS 自带的 libuuid 是最轻量、最合规的选择,生成的是 RFC 4122 标准的 128-bit 随机 UUID。它不依赖 Boost 或 C++17 以上特性,编译时加 -luuid 即可。
常见错误是直接调用 uuid_generate() 后未用 uuid_unparse() 转成字符串,导致内存乱码或崩溃;还有人误把 uuid_t 当作字符串指针传给 printf。
- 包含头文件:
#include -
uuid_t是 16 字节 数组,不是字符串,必须用uuid_unparse()转换 - 生成后记得检查
uuid_is_null()防止生成失败(比如 /dev/urandom 不可用) - 示例代码片段:
uuid_t uid; char str[37]; // 36 chars + ' ' uuid_generate(uid); if (!uuid_is_null(uid)) {uuid_unparse(uid, str); printf("UUID: %sn", str); // e.g. "f47ac10b-58cc-4372-a567-0e02b2c3d479" }
Windows 下用 CoCreateGuid() 替代
Windows 没有 libuuid,但 COM 提供了系统级可靠的 CoCreateGuid(),生成的也是标准 UUID。注意必须初始化 COM 库,否则会返回 RPC_E_CHANGED_MODE 错误。
容易忽略的是:如果项目没开 COM 支持(比如纯控制台工程未调用 CoInitializeEx()),CoCreateGuid() 会静默失败,返回全零 GUID。
立即学习“C++ 免费学习笔记(深入)”;
- 包含头文件:
#include和#include - 必须在调用前执行
CoInitializeEx(nullptr, COINIT_MULTITHREADED) - 用
StringFromGUID2()转字符串,输出缓冲区至少需 39 字符(含{……}和