Независимая от платформы генерация GUID в C ++? - PullRequest
53 голосов
/ 13 февраля 2009

Каков наилучший способ программно сгенерировать GUID или UUID в C ++, не полагаясь на инструмент для конкретной платформы? Я пытаюсь создать уникальные идентификаторы для объектов в симуляции, но не могу полагаться на реализацию Microsoft, поскольку проект является кросс-платформенным.

Примечания:

  • Так как это для симулятора, я на самом деле не нужна криптография хаотичность.
  • Было бы лучше, если бы это было 32-битное число.

Ответы [ 6 ]

45 голосов
/ 13 февраля 2009

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

38 голосов
/ 26 октября 2009

в linux: man uuid

на win: проверить структуру UUID и функцию UuidCreate в msdn

[править] функция будет выглядеть следующим образом

extern "C"
{
#ifdef WIN32
#include <Rpc.h>
#else
#include <uuid/uuid.h>
#endif
}

std::string newUUID()
{
#ifdef WIN32
    UUID uuid;
    UuidCreate ( &uuid );

    unsigned char * str;
    UuidToStringA ( &uuid, &str );

    std::string s( ( char* ) str );

    RpcStringFreeA ( &str );
#else
    uuid_t uuid;
    uuid_generate_random ( uuid );
    char s[37];
    uuid_unparse ( uuid, s );
#endif
    return s;
}
14 голосов
/ 01 июня 2014

Если вы не можете позволить себе использовать Boost, то я реализовал очень минимальную библиотеку, которая просто действует как оболочка для собственной реализации guid каждой операционной системы. Он должен работать в Windows (используя CoCreateGuid), Linux (используя libuuid), MacOS (используя CFUUID), iOS (также используя CFUUID) и Android (используя вызовы JNI для java.util.UUID). Функция генерации guid имеет различную реализацию в каждой системе, но есть единственная универсальная реализация для сравнения, строкового анализа и анализа.

Это лицензия MIT и доступна на GitHub:

https://github.com/graeme-hill/crossguid

2 голосов
/ 13 февраля 2009

Лучше всего просто использовать guid / uuid на целевой платформе. Трудно сделать это правильно (пойдем по магазинам;)).

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

1 голос
/ 13 февраля 2009

Генератор GUID обычно зависит от аппаратных характеристик машины, обычно таких как MAC-адреса или IP-адреса. Единственное, что вы можете сделать абсолютно независимым от платформы, это использовать какой-то PRNG , посеянный вручную или посеянный из какого-то источника времени. Это обычно не генерирует истинный глобально уникальный идентификатор в том смысле, что вам гарантировано, что никто в мире не генерирует такое же число.

0 голосов
/ 13 февраля 2009

Что ж, одним из оригинальных (?) Решений было бы использование веб-службы для получения GUID, но я сомневаюсь, что это будет хорошим решением для программы на C ++, особенно если она не включена по сети.

Вот URL, который может пригодиться, если вы решите воспользоваться этой опцией: http://www.hoskinson.net/GuidGenerator/default.asp

...