Алгоритм генерации уникального идентификатора в C ++?

Это точно правильно, потому что компилятор должен знать, какой тип он предназначен для распределения. Поэтому классы шаблонов, функции, перечисления и т. Д. Должны быть реализованы также в файле заголовка, если он должен быть опубликован или частично из библиотеки (статический или динамический), поскольку файлы заголовков НЕ скомпилированы в отличие от файлов c / cpp, которые находятся. Если компилятор не знает, что тип не может его скомпилировать. В .Net это возможно, потому что все объекты происходят из класса Object. Это не .Net.

30
задан Peter Mortensen 1 January 2010 в 15:53
поделиться

5 ответов

Получить уникальный 32-битный идентификатор интуитивно просто: следующий. Работает в 4 миллиарда раз. Уникален в течение 136 лет, если вам понадобится один раз в секунду. Дьявол в деталях: каким был предыдущий? Вам нужен надежный способ сохранить последнее использованное значение и атомный способ его обновления.

Насколько это будет сложно, зависит от области применения ID. Если это один поток в одном процессе, то вам нужен только файл. Если это несколько потоков в одном процессе, то вам нужен файл и мьютекс. Если на одной машине несколько процессов, то вам нужен файл и именной мьютекс. Если это несколько процессов на нескольких машинах, то вам нужно назначить авторитетного ID-провайдера, единственный сервер, с которым будут общаться все машины. Движок базы данных - это обычный провайдер, он имеет встроенную функцию, столбец автоинкремента.

Расходы на получение ID постепенно увеличиваются по мере расширения области видимости. Когда это становится непрактичным, границы видимости в Интернете или у провайдера слишком медленны или недоступны, тогда вам нужно отказаться от 32-битного значения. Переключитесь на случайное значение. Достаточно случайное значение, чтобы сделать вероятность поражения машины метеором как минимум в миллион раз выше, чем повторение одного и того же ID. Опознание. Это всего в 4 раза больше.

56
ответ дан 27 November 2019 в 23:24
поделиться

Вы можете видеть это . (Полный ответ, я думаю, находится на переполнении стека.)
. Небольшое примечание для уникального идентификатора на C++ в Linux в этом сайте . И вы можете использовать uuid в Linux, смотрите эту man страницу и пример для этого.

Если вы используете окна и вам нужны API windows, см. эту MSDN страницу .

Эта страница Википедии также полезна: http://en.wikipedia.org/wiki/Universally_Unique_Identifier.

7
ответ дан 27 November 2019 в 23:24
поделиться
DWORD uid = ::GetTickCount();
::Sleep(100);
1
ответ дан 27 November 2019 в 23:24
поделиться

Контекста мало, но если вы ищете уникальный ID для объектов внутри вашего приложения, вы всегда можете использовать однокнопочный подход, подобный

class IDGenerator {
   public:
      static IDGenerator * instance ();
      uint32_t next () { return _id++; }
   private:
      IDGenerator () : _id(0) {}

      static IDGenerator * only_copy;
      uint32_t _id;
}

IDGenerator *
IDGenerator::instance () {
   if (!only_copy) {
      only_copy = new IDGenerator();
   }
   return only_copy;
}

А теперь вы можете получить уникальный ID в любой момент, сделав:

IDGenerator::instance()->next()

-1
ответ дан 27 November 2019 в 23:24
поделиться

Вот самый простой идентификатор, который я могу подумать.

MyObject obj;
uint32_t id = reinterpret_cast<uint32_t>(&obj);

В любой момент времени этот идентификатор будет уникальным в приложении. Ни один другой объект не будет расположен на том же адресе. Конечно, если вы перезагрузите приложение, объект может быть назначен новый идентификатор. И после того, как заканчивается срок службы объекта, другой объект может быть назначен тот же идентификатор.

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

И последнее, но не менее важно, если размер указателя больше 32 бит, сопоставление не будет уникальным.

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

11
ответ дан 27 November 2019 в 23:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: