c++ - UuidCreate 和 CoCreateGuid 的区别
问题描述
从 Win32 API调用UuidCreate和CoCreateGuid创建的 UUID 有区别吗?
文档说 CoCreateGuid 只是调用了 UuidCreate,但是文档中的备注却大相径庭。
只有 CoCreateGuid 特别提到了用例:
[...] 您将在分布式环境中用作持久标识符的绝对唯一编号。
而 Uuidcreate 则专注于解释不可追溯性:
[...] 生成的 UUID 无法追溯到生成它的计算机的以太网地址。它也不能与在同一台计算机上创建的其他 UUID 关联。
我认为差异可能只是历史性的,文档提到 UuidCreate 在过去某个时候出于安全原因从基于 MAC 的版本 1 UUID 更改为随机的不可追踪版本 4。如果需要基于 MAC 的 UUID,则引入了 UuidCreateSequential。
如果是这样,UuidCreate 的返回值(RPC_S_OK、RPC_S_UUID_LOCAL_ONLY、RPC_S_UUID_NO_ADDRESS)现在只是为了遗留兼容性而包含在内,并且基本上已经过时了?
有人知道更多吗?据我所知,没有区别。
解决方案
CoCreateGuid调用UuidCreate。
UuidCreate
曾经是唯一的函数,它是一个类型 1 (mac + datetime) uuid。
后来,一个孩子写的软件因为 MAC 地址被追溯到他的笔记本电脑后被捕,Windows Vista 变成UuidCreate
了4 类(随机)uuid。
微软将其添加UuidCreateSequential
为遗留类型 1 uuid。
出于安全原因,对 UuidCreate进行了修改,使其不再使用机器的 MAC 地址来生成 UUID。引入UuidCreateSequential是为了允许使用机器以太网卡的 MAC 地址创建UUID 。
推荐阅读
- reactjs - 如何使用 Reactjs 列出目录中的所有文件?
- javascript - 如何访问 Promise 的值?
- ios - SwiftyStoreKit.purchaseProduct - 未调用 App Delegate 中的关闭
- swift - 如果未在 init 上添加,场景子级不显示
- java - 如何在 Saxon-HE 的命令行中使用集成的扩展功能
- python - Python读取.3gpp文件
- mongodb - 如何编写查询以对 mongoDB 文档进行分组并获取总类别详细信息
- vb.net - 行数 System.Data.DataTableReader
- c - 如何解释这个 PMAP 输出?
- r - 拒绝采样循环在 R 中产生“长度为零”错误