Вопрос

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

Примечания:

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

Решение

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

Другие советы

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

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

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

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

Лучше всего просто использовать любой guid/uuid, который присутствует на целевой платформе.Сделать это правильно сложно (пойдем за покупками ;)).

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top