c++如何生成UUID唯一标识符_c++ uuid生成代码【源码】

发布时间 - 2026-02-02 00:00:00    点击率:
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 + '\0'
uuid_generate(uid);
if (!uuid_is_null(uid)) {
    uuid_unparse(uid, str);
    printf("UUID: %s\n", 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 字符(含 {...}\0
  • 示例关键段:
GUID guid;
CoInitializeEx(nullptr, COINIT_MULTITHREADED);
if (SUCCEEDED(CoCreateGuid(&guid))) {
    wchar_t wstr[39];
    StringFromGUID

2(guid, wstr, _countof(wstr)); // 转为 UTF-8 或直接使用宽字符 }

C++11 及以上:避免用 std::random_device 手搓 UUID

有人试图用 std::random_device + std::uniform_int_distribution 填充 16 字节再格式化,这**不推荐**——它生成的是伪随机字节,不满足 UUID v4 的位域规范(比如第 13 字节高 4 位必须是 0100),也不保证跨平台唯一性。

真正合规的 UUID v4 必须按 RFC 4122 设置版本号和变体位,手写易错且无必要。除非你明确知道自己在绕过系统熵源(如嵌入式无 /dev/urandom),否则别自己拼。

  • UUID v4 要求:第 13 字节前 4 位固定为 0100(即 0x40–0x4f),第 17 字节前 2 位固定为 10(即 0x80–0xbf
  • std::random_device 在某些 Windows MSVC 版本下退化为伪随机(仅基于时间),不可信
  • 若真要纯标库方案,优先考虑封装 libuuid 或 Windows API,而非重实现

跨平台封装建议:用宏隔离平台逻辑

不要写两套完全独立的生成函数,用预处理器统一入口。关键是把「生成」和「格式化」拆开,方便单元测试和替换底层实现。

容易踩的坑是把平台判断写在头文件里导致 ODR 违规,或者忘记在 Windows 下链接 ole32.lib

  • 定义统一接口:std::string generate_uuid_string()
  • Linux/macOS 分支走 uuid_generate() + uuid_unparse()
  • Windows 分支走 CoCreateGuid() + StringFromGUID2(),并确保链接 ole32.lib
  • 构建时加 -DPLATFORM_WINDOWS 或自动检测 _WIN32

真正的难点不在生成,而在确保每次调用都访问到足够熵源、不缓存旧值、不共享 uuid_t 实例——这些细节比选哪个函数更影响可靠性。


# linux  # windows  # 处理器  # 字节  # mac  # c++  # macos  # win  # cos  # String  # 封装  # include  # printf  # 标识符  # 字符串  # 位域  # 预处理器  # 指针  # 接口  # 的是  # 头文件  # 也不  # 而在  # 知道自己  # 自带  # 而非  # 它不  # 写在  # 则会 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何用搬瓦工VPS快速搭建个人网站?  Python高阶函数应用_函数作为参数说明【指导】  Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】  javascript如何操作浏览器历史记录_怎样实现无刷新导航  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】  如何在搬瓦工VPS快速搭建网站?  如何在橙子建站上传落地页?操作指南详解  重庆市网站制作公司,重庆招聘网站哪个好?  Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能  微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】  夸克浏览器网页跳转延迟怎么办 夸克浏览器跳转优化  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  Laravel如何使用Passport实现OAuth2?(完整配置步骤)  Laravel路由怎么定义_Laravel核心路由系统完全入门指南  北京的网站制作公司有哪些,哪个视频网站最好?  JavaScript如何操作视频_媒体API怎么控制播放  Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全  JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  如何快速上传自定义模板至建站之星?  VIVO手机上del键无效OnKeyListener不响应的原因及解决方法  javascript中数组(Array)对象和字符串(String)对象的常用方法总结  如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环  如何在阿里云虚拟主机上快速搭建个人网站?  html5的keygen标签为什么废弃_替代方案说明【解答】  WordPress 子目录安装中正确处理脚本路径的完整指南  如何快速辨别茅台真假?关键步骤解析  公司门户网站制作流程,华为官网怎么做?  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复  Laravel怎么在Controller之外的地方验证数据  Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布  javascript中对象的定义、使用以及对象和原型链操作小结  如何在云主机上快速搭建网站?  如何在Ubuntu系统下快速搭建WordPress个人网站?  Laravel如何生成API文档?(Swagger/OpenAPI教程)  Claude怎样写约束型提示词_Claude约束提示词写法【教程】  详解jQuery停止动画——stop()方法的使用  高防服务器:AI智能防御DDoS攻击与数据安全保障  高防服务器租用首荐平台,企业级优惠套餐快速部署  如何快速重置建站主机并恢复默认配置?  如何在阿里云香港服务器快速搭建网站?  Laravel如何安装使用Debugbar工具栏_Laravel性能调试与SQL监控插件【步骤】  香港服务器WordPress建站指南:SEO优化与高效部署策略  Python企业级消息系统教程_KafkaRabbitMQ高并发应用  Python正则表达式进阶教程_复杂匹配与分组替换解析  如何在云主机上快速搭建多站点网站?  Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程  Laravel怎么在Blade中安全地输出原始HTML内容