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

Notas:

  • Ya que esto es un simulador, me
    realmente no necesita de cifrado
    la aleatoriedad.
  • Sería mejor si este es un número de 32 bits.
  • La respuesta a la [pregunta]: stackoverflow.com/questions/543306/… me dan una respuesta mejor.
  • Un GUID es por definición un número de 128 bits. Si lo desea, siempre puede tener 32 bits de uno, pero esto no está garantizado para ser únicos o incluso al azar.

6 Comentarios

  1. 45

    Si usted puede permitirse el lujo de usar el Boost, entonces hay una UUID de la biblioteca que debe hacer el truco. Es muy sencillo de utilizar – verificación de la documentación y esta respuesta.

    • Esto es exactamente lo que yo estaba esperando. Gracias
    • La lectura de la discusión y de mirar el código no puedo evitar la sensación de que este es todavía muy preliminar. En particular, la API será cambio y carece de tiempo basado en la creación de UUID. Dicho esto, el enfoque es bueno y adaptable y la aplicación es sólido (a excepción de uno de ellos destacó la raza cond.).
    • Sí, hubo al menos dos debates, uno de los problemas relacionados con las interfaces, lexical_cast, etc, y el otro era sobre PODness. Yo no les siguió.
    • Hola anon, estas dos cuestiones (PODness y lex_cast) han sido resueltas por ahora, y muy elegante. 🙂 De todos modos, estoy muy feliz de que hayas publicado esta referencia, en primer lugar: me puede y va a hacer un amplio uso de ella. Estoy convencido de que las cuestiones pendientes se resuelvan pronto.
    • Por favor, actualice su respuesta, ya que la biblioteca fue aceptado para el Impulso de la familia.
    • Es posible el uso de la biblioteca, independientemente de Impulso? A mí me parece demasiado sobrepeso para agregar Impulso a un proyecto, que acaba de obtener el Guid!

  2. 40

    en linux: el hombre uuid

    de ganar: la salida para el UUID de la estructura y UuidCreate función en msdn

    [editar] la función aparecen como este

    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;
    }
    • Nota: En Visual Studio C++, «deshabilitar extensiones de lenguaje» debe estar ajustado a NO. Aún así, me estoy haciendo sin resolver extern errores. Lo que las bibliotecas tengo que incluir, y cómo?
    • rpcrt4 es la lib que usted necesita. Que el código fue compilado con gcc + mingw de todos modos.
    • Sobre la rpcrt4.lib enlace problema: ASÍ que: ¿Cómo resolver el Enlace de Error en la llamada a ::UuidToString()?
  3. 14

    Si usted no puede permitirse el lujo de usar el Boost, entonces existe una muy mínima de la biblioteca que he implementado que simplemente actúa como un contenedor para cada sistema operativo nativo del guid de la aplicación. Se debe trabajar en Windows (usando CoCreateGuid), Linux (usando libuuid), MacOS (utilizando CFUUID), iOS (también mediante CFUUID) y Android (usando JNI llamadas a java.util.UUID). El guid de la función de generación tiene una aplicación diferente en cada sistema, pero no es la única implementación genérica para comparar, stringifying, y de análisis.

    Es el MIT con licencia y está disponible en GitHub:

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

  4. 2

    Simplemente usando cualquier guid/uuid está presente en el objetivo de la plataforma es la mejor. Hacerlo bien duro (vamos a ir de compras ;)).

    La probabilidad de una colisión entre dos identificadores diferentes, pero bien ejecutado implementaciones deben estar bien más allá de cualquier posibilidad razonable de que ocurre en este universo de la vida.

    • si desea singularidad en un número de 32 bits (sin la cooperación) usted tiene un problema. Partición de la gama y la asignación de ellos como sea necesario, es la única forma…
  5. 1

    Un generador GUID generalmente se basa en las características del hardware de la máquina, generalmente de cosas como las direcciones MAC o Ip. La única cosa que usted puede hacer, es absolutamente independiente de la plataforma es utilizar algún tipo de PRNG cabeza de serie manualmente o sembradas de algún tiempo de origen. Esto no suele generar un verdadero identificador único global en el sentido de que se garantiza que nadie en el mundo genera el mismo número.

Dejar respuesta

Please enter your comment!
Please enter your name here