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


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

Примечания:

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

6 ответов:

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

в linux: man uuid

on win: проверьте структуру 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;
}

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

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

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

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

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

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

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

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