2012-06-08 2 views
2

Я использую 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(); 
} 

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

Thanks

+2

Вы знаете, что часть «U» [UUID] (http://en.wikipedia.org/wiki/Universally_unique_identifier) ​​означает «Уникальный» ... – tadman

+1

Да, но если у boost есть плохой случайный алгоритм, который делает не важно. – jmasterx

ответ

8

Ну, это зависит.

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

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

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

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

Тогда вы можете по крайней мере, утверждают, что:

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

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

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

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

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

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

Ссылки
http://blogs.msdn.com/b/oldnewthing/archive/2008/06/27/8659071.aspx
http://en.wikipedia.org/wiki/Birthday_attack

1

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

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

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

0

Нет, вы не можете предположить, что вы никогда не получите дубликат.
BUT вы можете взглянуть на wikipedia, чтобы получить дубликат.
И поскольку boost следовали спецификации ITU, я думаю, вы можете предположить, что никогда не будет дубликатов.

+7

Если вы делаете математику, есть более высокий шанс вторжения инопланетян, чем столкновения UUID. – tadman

+0

@tadam ROFL спасибо, хорошо начать новый день смеяться! –

Смежные вопросы