Я думаю, что вы уже решили эту проблему для большинства практических целей, найдя Boost :: Uuid, за исключением вашего требования перерабатывать уже сгенерированные идентификаторы.
Из документации , на которую вы ссылались в вопросе:
Когда UUID генерируются одним из
определенные механизмы, они либо
гарантированно быть уникальным, другим
из всех других сгенерированных UUID (что
есть, он никогда не создавался раньше
и это никогда не будет генерироваться снова),
или это очень вероятно, чтобы быть уникальным
(в зависимости от механизма).
Если вы одержимы рециркуляцией и повторным использованием существующих идентификаторов, я полагаю, что вы сможете со временем создавать пул UUID, генерируя новые только тогда, когда он вам нужен, и обнаружите, что пул пуст. Но я не могу представить сценарий, в котором это было бы предпочтительнее, чем генерация нового UUID.
РЕДАКТИРОВАТЬ : Вы прокомментировали, что вам нужна гарантия уникальности. Реально, вы никогда не получите его при программной генерации уникального идентификатора. На практике вы собираетесь хранить сгенерированный идентификатор в типе данных, который имеет конечный размер, и поэтому возможный набор идентификаторов, которые вы можете сгенерировать, также конечен. ИМХО, тогда лучшее, что вы можете достичь, это моделировать уникальность в пределах допустимого порога.
Вы можете сделать это
Использование техники, которая делает шансы получить дубликат UUID очень удаленным (это то, что будет делать Boost :: UUID);
Включение генерации UUID с высокой степенью вероятности быть уникальным в какую-то другую логику, которая ищет вновь сгенерированный UUID в списке уже сгенерированных UUID, чтобы исключить эту крошечную вероятность того, что новый UUID это дубликат. Очевидно, что практичность этого уменьшается, когда вы приближаетесь к очень большому количеству UUID в вашем списке. Сколько вы ожидаете генерации?
Если вы хотите действительно огромное количество уникальных идентификаторов, больше, чем умещается в нативном типе, вы можете реализовать тип, который управляет памятью и выполняет необходимые математические операции, и просто создавать последовательные идентификаторы, или вы можете, возможно, используйте что-то вроде GNU Bignum Library , чтобы сделать это для вас.