Pregunta

¿Cuál es la mejor manera de generar programación un GUID o UUID en C ++ sin depender de una herramienta específica de la plataforma? Estoy tratando de hacer que los identificadores únicos para los objetos en una simulación, pero no se puede confiar en la implementación de Microsoft ya que el proyecto es multiplataforma.

Notas:

  • Dado que se trata de un simulador, yo realmente no necesita criptográfica aleatoriedad.
  • Sería mejor si se trata de un número de 32 bits.
¿Fue útil?

Solución

Si usted puede permitirse el lujo de usar Boost, entonces hay una href="http://www.boost.org/libs/uuid" rel="noreferrer"> UUID biblioteca que debe hacer el truco. Es muy fácil de usar -. Comprobar la documentación y esta respuesta

Otros consejos

En Linux: hombre uuid

en la victoria: consulta para la estructura y la función UUID UuidCreate en MSDN

[editar] la función aparecería como esto

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

Si usted no puede permitirse el lujo de usar Boost, entonces hay una biblioteca muy mínima que he implementado el que simplemente actúa como una envoltura alrededor de la implementación nativa GUID de cada sistema operativo. Debería funcionar en Windows (usando CoCreateGuid), Linux (usando libuuid), MacOS (usando CFUUID), iOS (también usando CFUUID) y Android (usando llamadas JNI a java.util.UUID). La función de generación GUID tiene una aplicación diferente en cada sistema, pero no hay una sola aplicación genérica para comparar, stringifying, y el análisis.

Se licencia MIT y disponible en GitHub:

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

Simplemente usando cualquier GUID / UUID está presente en la plataforma de destino es lo mejor. Haciendo bien es difícil (vamos a ir de compras;)).

La probabilidad de una colisión entre dos identificadores de diferentes implementaciones, pero bien ejecutados debería ser mucho más allá de cualquier posibilidad razonable de que ocurra en la vida de este universo.

Un generador GUID lo general se basa en las características de hardware de la máquina, por lo general cosas como direcciones MAC o IP. La única cosa que puede hacer que es absolutamente independiente de la plataforma es utilizar algún tipo de PRNG cabeza de serie manualmente o sembrado de alguna fuente tiempo. Esto por lo general no genera un cierto identificador único global en el sentido que se le garantiza que nadie en el mundo genera el mismo número.

Bueno, un poco convencional (?) Solución sería utilizar un servicio web para obtener el GUID pero dudo que esto va a ser una buena solución para un programa en C ++, especialmente si no está habilitado para la red.

Aquí es una dirección URL que podría ser útil si decide seguir esta opción: http: //www.hoskinson.net/GuidGenerator/default.asp

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top