Pergunta

O que é a melhor maneira de programaticamente gerar um GUID ou UUID em C ++ sem depender de uma ferramenta específica da plataforma? Eu estou tentando fazer identificadores exclusivos para objetos em uma simulação, mas não pode contar com a implementação da Microsoft como o projeto é multi-plataforma.

Notas:

  • Uma vez que este é um simulador, I realmente não precisa de criptografia aleatoriedade.
  • Seria melhor se esse é um número de 32 bits.
Foi útil?

Solução

Se você pode dar ao luxo de usar Boost, então há uma href="http://www.boost.org/libs/uuid" rel="noreferrer"> UUID biblioteca que deve fazer o truque. É muito simples de usar -. Verificar a documentação e esta resposta

Outras dicas

no Linux: Homem uuid

na vitória: confira para a estrutura UUID e função UuidCreate no MSDN

[editar] a função seria parecido com

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

Se você não pode dar ao luxo de usar Boost, então há uma biblioteca muito mínimo que eu implementei que simplesmente age como um invólucro em torno implementação guid nativa de cada sistema operacional. Ele deve funcionar no Windows (usando CoCreateGuid), Linux (usando libuuid), MacOS (usando CFUUID), iOS (também usando CFUUID) e Android (usando chamadas JNI para java.util.UUID). A função de geração guid possui uma implementação diferente em cada sistema, mas não há implementação genérica única para comparar, stringifying e análise.

É MIT licenciado e disponível no GitHub:

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

Simplesmente usando qualquer guid / uuid está presente na plataforma de destino é o melhor. Fazendo a coisa certa é difícil (Vamos às compras;)).

A probabilidade de uma colisão entre dois identificadores de diferentes, mas bem executados implementações devem estar bem além de qualquer chance razoável de acontecer na vida deste universo.

A GUID gerador geralmente depende de características da máquina, geralmente coisas como endereços MAC ou IPs de hardware. A única coisa que você pode fazer o que é absolutamente independente de plataforma é usar algum tipo de PRNG semeado manualmente ou semeado de alguma fonte tempo. Isso geralmente não gera um verdadeiro identificador exclusivo global no sentido de que você está garantido que ninguém no mundo gera o mesmo número.

Bem, um excêntrico (?) Solução seria usar um serviço web para obter o GUID, mas eu duvido que isso vai ser uma boa solução para um C ++ programa especialmente se ele não está habilitado para rede.

Aqui está uma URL que pode vir a calhar se você optar por seguir essa opção: http: //www.hoskinson.net/GuidGenerator/default.asp

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top