Independente de plataforma de geração GUID em C ++?
-
23-08-2019 - |
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.
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:
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