假设boost :: uuid不会返回副本是否安全?

jma*_*erx 2 c++ uuid boost boost-uuid

我正在使用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();
}
Run Code Online (Sandbox Code Playgroud)

假设我永远不会得到重复或者我应该对活动会话进行检查是否安全?

谢谢

Adr*_*tti 8

这得看情况.

当UUID由其中一个定义的机制生成时,它们要么保证是唯一的,要么与所有其他生成的 UUID 不同(也就是说,它之前从未生成过,它永远不会再生成),或者极有可能是独一无二的(取决于机制).

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

我们转到文档的第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