Подтвердить что ты не робот

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

Что может быть лучшим алгоритмом для создания уникального идентификатора в С++? Идентификатор длины должен быть 32-разрядным целым без знака.

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

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

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

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

Ответ 3

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

Если вы используете окна и нужны API-интерфейсы Windows, см. эту страницу http://en.wikipedia.org/wiki/Universally_Unique_Identifier.

Ответ 4

DWORD uid = ::GetTickCount();
::Sleep(100);

Ответ 5

Существует мало контекста, но если вы ищете уникальный идентификатор для объектов в своем приложении, вы всегда можете использовать одноэлементный подход, похожий на

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;
}

И теперь вы можете получить уникальный идентификатор в любое время:

IDGenerator::instance()->next ()

Ответ 6

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