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

Независимо от платформы GUID поколения в С++?

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

Примечания:

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

Ответ 1

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

Ответ 2

в linux: man uuid

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

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

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

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

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