0

0

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

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-02-02 16:42:08

|

890人浏览过

|

来源于php中文网

原创

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

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

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];
    StringFromGUID2(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),也不保证跨平台唯一性。

自由画布
自由画布

百度文库和百度网盘联合开发的AI创作工具类智能体

下载

真正合规的 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 实例——这些细节比选哪个函数更影响可靠性。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

523

2023.08.02

printf用法大全
printf用法大全

php中文网为大家提供printf用法大全,以及其他printf函数的相关文章、相关下载资源以及各种相关课程,供大家免费下载体验。

75

2023.06.20

fprintf和printf的区别
fprintf和printf的区别

fprintf和printf的区别在于输出的目标不同,printf输出到标准输出流,而fprintf输出到指定的文件流。根据需要选择合适的函数来进行输出操作。更多关于fprintf和printf的相关文章详情请看本专题下面的文章。php中文网欢迎大家前来学习。

287

2023.11.28

mysql标识符无效错误怎么解决
mysql标识符无效错误怎么解决

mysql标识符无效错误的解决办法:1、检查标识符是否被其他表或数据库使用;2、检查标识符是否包含特殊字符;3、使用引号包裹标识符;4、使用反引号包裹标识符;5、检查MySQL的配置文件等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

184

2023.12.04

Python标识符有哪些
Python标识符有哪些

Python标识符有变量标识符、函数标识符、类标识符、模块标识符、下划线开头的标识符、双下划线开头、双下划线结尾的标识符、整型标识符、浮点型标识符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

289

2024.02.23

java标识符合集
java标识符合集

本专题整合了java标识符相关内容,想了解更多详细内容,请阅读下面的文章。

259

2025.06.11

c++标识符介绍
c++标识符介绍

本专题整合了c++标识符相关内容,阅读专题下面的文章了解更多详细内容。

126

2025.08.07

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

361

2023.08.03

AO3官网入口与中文阅读设置 AO3网页版使用与访问
AO3官网入口与中文阅读设置 AO3网页版使用与访问

本专题围绕 Archive of Our Own(AO3)官网入口展开,系统整理 AO3 最新可用官网地址、网页版访问方式、正确打开链接的方法,并详细讲解 AO3 中文界面设置、阅读语言切换及基础使用流程,帮助用户稳定访问 AO3 官网,高效完成中文阅读与作品浏览。

45

2026.02.02

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 8.3万人学习

Git 教程
Git 教程

共21课时 | 3.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号