【问题标题】:Is it safe to assume boost::uuid won't return a duplicate?假设 boost::uuid 不会返回重复项是否安全?
【发布时间】:2012-06-12 16:32:11
【问题描述】:

我正在使用 boost uuid 来生成会话 ID。

std::string SessionGenerator::generate()
{
    boost::uuids::uuid id = m_rgen();
    m_ss.clear();
    m_ss.str("");
    m_ss << id;

    return m_ss.str();
}

可以假设我永远不会得到重复,还是应该对活动会话进行检查?

谢谢

【问题讨论】:

  • 您知道UUID 的“U”部分确实代表“唯一”...
  • 是的,但是如果 boost 的随机算法不好也没关系。

标签: c++ boost uuid boost-uuid


【解决方案1】:

好吧,这取决于。

当 UUID 由定义的机制之一生成时,它们要么保证是唯一的不同于所有其他生成的 UUID(也就是说,它从未被之前生成,并且永远不会再次生成),或者它极有可能是唯一的(取决于机制)。

这意味着问题可能出在您使用的发电机上。他们说他们正在使用ITU-T specification

让我们转到文档的第 7 页。如果您使用时间并且可以假设:

  • 系统时间不会改变。
  • 用于识别机器的节点 ID 不会改变。

那么你至少可以断言:

“UUID 将不同于所有其他生成的 UUID”,因为时间流逝且粒度为 100 ns。

如果您需要与其他机器共享生成的 UUID 或时间会发生变化,可能会发生冲突(不要忘记在许多国家/地区每年两次都会调整时间)。这就是为什么有一个 时钟序列 字段。此外,它非常小,因此在这种情况下,您可以断言:

“UUID 极有可能是唯一的。”

如果您使用的是随机数生成器而不是这个,那么您只能断言:

“UUID 极有可能是唯一的。” 因为随机数生成器的要求不是生成唯一的数字(但使用好的随机数生成器您的极有可能很有可能)。

所以在正常条件下(例如,如果您没有将一张网卡从一台计算机移动到另一台计算机并且您将时间改回过去)我想您可以假设它们是独特的(使用时间)。如果您使用的是随机数生成器,您不能假设它们是唯一的,但极有可能是唯一的(关于碰撞概率......嗯......如果它发生在一个好的随机数生成器上,你应该留在回家迎接下一场流星雨)。

参考文献
http://blogs.msdn.com/b/oldnewthing/archive/2008/06/27/8659071.aspx
http://en.wikipedia.org/wiki/Birthday_attack

【讨论】:

    【解决方案2】:

    如果单个生成器正在生成所有 uuid,则应保证它们是唯一的。免责声明,我没有查看代码或文档来验证这一点,但这是一个设计目标。

    有不同类别的 uuid,其中一些包括来自运行它的机器或环境的位。这将减少与其他地方生成的 ID 发生冲突的机会。

    即使在最坏的情况下,由于 RAM 错误而损坏 ID 的几率也远高于生成两个相同 ID。没有人担心这一点。

    【讨论】:

      【解决方案3】:

      不,您不能假设您从不得到重复。
      但是您可以查看wikipedia,了解得到重复的概率。 而且由于boost 遵循 ITU 规范,我认为您可以假设永远不会有重复。

      【讨论】:

      • 如果你算一算,外星人入侵的可能性比 UUID 碰撞的可能性要高。
      • @tadam ROFL 谢谢你,笑着开始新的一天真好!
      猜你喜欢
      • 1970-01-01
      • 2016-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-24
      • 1970-01-01
      • 2013-08-23
      • 1970-01-01
      相关资源
      最近更新 更多