Можно ли предположить, что boost::uuid не вернет дубликат?

Я использую Boost UUID для генерации идентификаторов сессии.

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

    return m_ss.str();
}

Можно ли предположить, что я никогда не получу дубликат или я должен проверять активные сеансы?

Спасибо

3 ответа

Решение

Смотря как.

Когда идентификаторы UUID генерируются одним из определенных механизмов, они либо гарантированно будут уникальными, отличными от всех других сгенерированных идентификаторов UUID (то есть никогда не генерировались ранее и никогда не будут генерироваться снова), либо крайне вероятно, что быть уникальным (в зависимости от механизма).

Это означает, что проблема может быть в используемом генераторе. Они говорят, что используют спецификацию ITU-T.

Давайте перейдем к странице 7 документа. Если вы используете время и можете считать, что:

  • Системное время не изменится.
  • ID узла, используемый для идентификации машины, не изменится.

Тогда вы можете хотя бы утверждать, что:

"UUID будет отличаться от всех других сгенерированных UUID", потому что время течет, а степень детализации составляет 100 нс.

Может возникнуть коллизия, если вам нужно поделиться сгенерированным UUID с другими машинами, или время изменится (не забывайте, что во многих странах дважды в год происходит корректировка времени). Вот почему есть поле последовательности часов. Более того, он довольно маленький, поэтому в этом случае вы утверждаете, что:

"UUID, скорее всего, будет уникальным".

Если вы используете вместо этого генератор случайных чисел, то вы можете утверждать только следующее:

"UUID, скорее всего, будет уникальным". потому что требование генератора случайных чисел не состоит в том, чтобы генерировать уникальные числа (но с хорошим генератором случайных чисел вы, скорее всего, будете ЧРЕЗВЫЧАЙНО вероятны).

Таким образом, в нормальных условиях (например, если вы не перемещаете одну сетевую карту с одного компьютера на другой и изменяете время назад на прошлое), я предполагаю, что вы можете предположить, что они уникальны (используя время). Если вы используете генератор случайных чисел, вы не можете предполагать, что они уникальны, но просто очень вероятно, что они уникальны (о вероятности столкновений... хорошо... если это происходит с хорошим генератором случайных чисел, вы должны остаться в дом для следующего метеорного потока).

Рекомендации
http://blogs.msdn.com/b/oldnewthing/archive/2008/06/27/8659071.aspx
http://en.wikipedia.org/wiki/Birthday_attack

Если один генератор производит все ваши uuids, они должны быть гарантированно уникальными. Отказ от ответственности, я не смотрел на код или документацию, чтобы проверить это, но это цель дизайна.

Существуют разные классы UUID, некоторые из которых включают биты из машины или среды, в которой он работает. Это уменьшит вероятность столкновения с идентификаторами, произведенными в других местах.

Даже в худшем случае ваши шансы исказить идентификатор из-за ошибок ОЗУ намного выше, чем при создании двух идентичных идентификаторов. И никто не беспокоится об этом.

Нет, вы не можете предполагать, что вы никогда не получите дубликат.
НО вы можете взглянуть на википедию на предмет вероятности получить дубликат.
И с тех пор boost следуя спецификации МСЭ, я думаю, вы можете предположить, что никогда не будет дубликатов.

Другие вопросы по тегам