2009-02-12 5 views
50

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

Примечания:

  • Поскольку это для тренажера, я действительно не нужно криптографической хаотичность.
  • Было бы лучше, если это 32-разрядное число.
+0

Ответ на [вопрос]: http://stackoverflow.com/questions/543306/platform-independent-guid-generation-in -c дать мне лучший ответ. –

+0

GUID - это [по определению] (https://en.wikipedia.org/wiki/Globally_unique_identifier) ​​128-битное число.Если вы хотите, вы всегда можете взять 32 бита от одного, но он не гарантированно будет уникальным или даже случайным. –

ответ

43

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

+0

Именно это я и надеялся. Спасибо –

+0

Читая дискуссию и глядя на код, я не могу предотвратить ощущение, что это все еще очень предварительное. В частности, API * будет * изменяться, и ему не хватает создания UUID по времени. Тем не менее, этот подход является хорошим и адаптируемым, и реализация является твердой (за исключением одной отмеченной гонки). –

+0

Да, было, по крайней мере, два последующих обсуждения - одна из проблем, связанных с интерфейсами, lexical_cast и т. Д., А другая - о PODness. Я не последовал за ними. – Anonymous

1

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

2

Простое использование любого guid/uuid присутствует на целевой платформе. Правильно делать это сложно (пойдем по магазинам;)).

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

+1

Если вы хотите уникальность в 32-разрядном номере (без сотрудничества), у вас есть проблема. Разделение диапазона и назначение их по мере необходимости - это единственный способ ... – ShuggyCoUk

-1

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

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

34

на Linux: человек UUID

на победу: проверить для структуры 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; 
} 
+0

Примечание. В Visual Studio C++ для параметра «отключить языковые расширения» должно быть установлено значение НЕТ. Тем не менее, я получаю нерешенные ошибки extern. Какие библиотеки я должен включить и как? –

+1

rpcrt4 - это lib, который вам нужен. Этот код был скомпилирован с gcc + mingw. – ubik

10

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

Он MIT лицензирован и доступен на GitHub:

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