【问题标题】:Boost::UUID setting specific valueBoost::UUID 设置具体值
【发布时间】:2020-07-12 11:31:37
【问题描述】:

在 Java UUID 类中,有一种方法可以设置上限和下限 long 来为 UUID 创建特定值。

UUID test(-1, -1);

将生成 UUID:ffffffff-ffff-ffff-ffff-ffffffffffff

是否有类似的方法可以在 C++ 中使用 BOOST UUID 创建一个,然后创建一个字符串版本并将其转换回 UUID?

【问题讨论】:

  • 您查阅过文档吗?
  • 您是指将 16 个字节中的每一个都设置为 -1 吗?如果值不是全部为 0xff 怎么办?
  • 我不是在指任何东西,我是在问您是否查阅过文档。大概其中列出了可用的功能。您认为其中缺少什么吗?
  • 这里描述了两种方法。 1. 从字符串转换,2. 分别设置 16 个字节中的每一个。这些都不是理想的。这就是为什么 Java 的设置 2 个长值的版本如此有利的原因
  • 那这就是你的答案,不是吗?对不起!

标签: c++ boost uuid boost-uuid


【解决方案1】:

将整数传递给构造函数将是模棱两可的,因为您不知道它们会生成什么 UUID,因为整数在不同平台上可以具有不同的字节表示。当然,全 1(如 -1)和全 0 或多或少会使其明显,但其他整数值呢?

解决方案是从字符串或字节构造 UUID。

boost::uuids::uuid u1{{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }};

boost::uuids::uuid u2 = boost::uuids::string_generator()("ffffffff-ffff-ffff-ffff-ffffffffffff");

std::istringstream strm("ffffffff-ffff-ffff-ffff-ffffffffffff");
boost::uuids::uuid u3;
strm >> u3;

【讨论】:

  • 我将不得不专门对字节表示进行投票。几十年来,这一直是不同架构之间的一个已知问题,这就是为什么 htonl/ntohl 和类似功能目前作为套接字通信的一部分存在的原因,但这并不意味着它们不能被迁移出去。
  • 不确定您对答案的抱怨。存在 Endian 转换例程,但它并不使它们成为 UUID 构造的合适工具。我敢打赌,95% 的用户在初始化 UUID 时不会调用字节序转换函数。
  • 投诉很简单。在调用 uuid 构造函数之前,用户不应调用字节序转换。如果这是一个问题,则应由构造函数代码本身解决。因此,由于内部表示的字节顺序,您不知道将从整数或更确切地说是 64 位整数构造什么 UUID 的观点是无效的。
  • 这里唯一的问题就是答案在于当前版本的 boost::uuid 是在字符串或随机生成之外,构造它的唯一方法是使用字节值列表,这真是令人讨厌。
  • @Karlson 让 UUID 构造函数转换字节顺序也是违反直觉的,因为这不是其他类型的正常行为。这就是为什么我说这会让用户感到困惑——要么构造函数的内部行为不明显,要么用户必须努力以非常具体、容易出错、可能不可移植的方式提供输入。请注意,Boost.UUID 实现的 RFC4122 并未将 UUID 定义为一对 64 位整数。如果您必须以这种方式构造 UUID,我怀疑您可能做错了什么。
猜你喜欢
  • 2019-06-04
  • 1970-01-01
  • 1970-01-01
  • 2018-12-20
  • 1970-01-01
  • 2011-03-28
  • 2018-02-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多