我正在使用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();
}
假设我永远不会得到重复或我是否应该对活动会话进行检查是否安全?
由于
答案 0 :(得分:8)
嗯,这取决于。
当UUID由其中一个定义的机制生成时,它们保证是唯一的,与所有其他生成的 UUID不同(也就是说,它从未被之前生成并且永远不会再次生成),或者非常可能是唯一的(取决于机制)。
这意味着问题可能出在您正在使用的发电机上。他们说他们正在使用ITU-T specification。
让我们转到文档的第7页。如果你正在使用时间,你可以认为:
然后你至少可以断言:
“UUID将与所有其他生成的UUID”不同,因为时间流量和粒度为100 ns。
如果你需要与其他机器共享生成的UUID,或者时间会发生变化,可能会发生冲突(不要忘记,在许多国家,每年有两次时间调整)。这就是时钟序列字段的原因。而且它非常小,所以在这种情况下你可以断言:
“UUID极有可能是唯一的。”
如果您使用的是随机数生成器,那么您只能断言:
“UUID非常可能是唯一的。”因为随机数生成器的要求不是生成唯一数字(但是使用好的随机数生成器极有可能< / em> 很可能)。
因此,在正常条件下(例如,如果您没有将一个网卡从一台计算机移动到另一台计算机并将时间更改回过去),我认为您可以认为它们是独特的(使用时间)。如果你使用的是随机数生成器,你不能认为它们是独一无二的,但极其可能是唯一的(关于碰撞的概率......好吧......如果它发生在一个好的随机数发生器上,你应该留在下一个流星雨的家。)
<强>参考强>
http://blogs.msdn.com/b/oldnewthing/archive/2008/06/27/8659071.aspx
http://en.wikipedia.org/wiki/Birthday_attack
答案 1 :(得分:1)
如果一台发电机正在生产所有的uuids,它们应该保证是唯一的。免责声明,我没有查看代码或文档来验证这一点,但这是一个设计目标。
有不同类别的uuids,其中一些包括来自机器或运行环境的位。这些将减少与其他地方生产的ID发生冲突的可能性。
即使在最糟糕的情况下,由于RAM错误而导致ID损坏的可能性远远高于生成两个相同的ID。没有人担心这一点。
答案 2 :(得分:0)
不,你不能认为你从不得到重复
但是您可以查看wikipedia获得重复的可能性
由于boost
遵循了ITU规范,我认为您可以假设永远不会有重复。