Я думаю, что вы уже решили эту проблему для большинства практических целей, набрав Boost :: Uuid, за исключением вашего требования перегенерировать уже созданные идентификаторы.
От documentation you linked to в вопросе:
Когда UUID, порождены одной из определенных механизмов , они либо гарантированно быть уникальным, отличается от всех других генерируемых UUID, (что есть, он никогда не генерировался до , и он больше никогда не будет сгенерирован), или он, скорее всего, будет уникальным (в зависимости от механизма).
Если вы одержимы переработки и повторного использования существующих идентификаторов, я полагаю, вы могли бы поддерживать создать пул UUID, со временем, создавая новые только тогда, когда он вам нужен, и найти то, что бассейн пустой. Но я не могу представить сценарий, где было бы предпочтительнее генерировать новый UUID.
EDIT: Вы отметили, что вам нужна гарантия уникальности. Реально, вы никогда не получите его при программном создании уникального идентификатора. На практике вы собираетесь хранить сгенерированный идентификатор в типе данных, который имеет конечный размер, и поэтому возможный набор идентификаторов, которые вы можете сгенерировать, также является конечным. ИМХО, лучшее, что вы можете достичь, это имитировать уникальность в пределах порога допуска.
Вы можете сделать это
Используя методику, которая делает шансы на получение дубликата UUID очень отдаленное (это то, что Повысьте :: UUID будет делать);
Обертывание поколения очень вероятно уникального UUID в некоторой другой логике, которая ищет вновь созданный UUID в списке уже созданных UUID, чтобы устранить эту крошечную вероятность того, что новый дубликат. Очевидно, что практичность этого становится уменьшающейся по мере приближения к большому количеству UUID в вашем списке. Сколько вы ожидаете генерации?
Если вы хотите поистине огромное количество уникальных идентификаторов, больше, чем подходит для родного типа, вы можете реализовать тип, который управляет памятью и выполняет необходимые математические вычисления, и просто создавать последовательные идентификаторы, или вы могли бы использовать что-то вроде GNU Bignum Library, чтобы сделать это за вас.
Ваши требования не ясны, как указано, вы можете 'Sprintf («ID% D», ++ ID)' со статическим счетчиком ид и было бы быть хорошим для пары миллиардов значений или возвращать 'std :: string' после' + = 'x'' ;-). Если на практике значения не исчерпаны, то переработка может быть не-операцией, или вы можете создать deque <> и использовать ее преимущественно. Какие другие ограничения/ожидания у вас действительно есть ... по длине, формату, производительности, уникальности кросс-узла, уникальности уникальности сквозного процесса и т. Д.?Или мы предполагаем вывести требования, подобные задаче Boost :: Uuid? –
Чтобы быть ясным, меня беспокоит целое число, так как я пишу длинный сервер. Моя главная забота - № 2 выше. –
Вы можете легко использовать неподписанную 64-битную 'int' или даже цепочку 2 с простым' if (! ++ low_order) ++ high_order; '...? Это должно быть хорошо, пока солнце не сгорает .... –