我正在使用 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();
}
假设我永远不会得到副本是否安全,或者我应该对活动会话进行检查?
谢谢
我正在使用 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 由定义的机制之一生成时,它们要么保证是唯一的,与所有其他生成的UUID 不同(也就是说,它以前从未生成过,也永远不会再次生成),要么极有可能是唯一的(取决于机制)。
这意味着问题可能出在您使用的发电机上。他们说他们正在使用ITU-T 规范。
让我们转到文档的第 7 页。如果您使用时间并且可以假设:
然后你至少可以断言:
“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
如果单个生成器正在生成所有 uuid,则应保证它们是唯一的。免责声明,我没有查看代码或文档来验证这一点,但这是一个设计目标。
有不同类别的 uuid,其中一些包括来自运行它的机器或环境的位。这些将减少与其他地方生产的 ID 发生冲突的机会。
即使在最坏的情况下,由于 RAM 错误而破坏 ID 的机会也远高于生成两个相同 ID 的机会。没有人担心这一点。
不,你不能假设你永远不会得到重复。
但是您可以查看维基百科以获得重复的概率。
而且由于boost
遵循 ITU 规范,我认为您可以假设永远不会有重复。