2010-02-01 12 views
7

Estoy atrapado en una situación extraña. Necesito generar UUID en mi programa Linux (que distribuyo usando RPM). No deseo agregar otra dependencia a mi aplicación requiriendo que el usuario instale libuuid (parece que libuuid no está incluido en la mayoría de las distribuciones de Linux, como CentOS).Generando UUID aleatorios en Linux

¿No hay una llamada al sistema Linux estándar que genera UUID (como por ejemplo, en Windows hay CoCreateGuid)? ¿Qué usa el comando uuidgen?

+0

uuidgen usa libuuid. –

Respuesta

5

¡Gracias por todos sus comentarios!

Fui a través de cada uno, y esto es lo adecuado para mi el mejor requisito:

Lo que necesitaba era simplemente UUID basados ​​en el tiempo que se generaron a partir de números aleatorios vez para cada usuario que instaló la aplicación. La versión 4 de UUID como se especifica en RFC 4122 fue exactamente eso. Fui a través de un algoritmo sugerido, y se acercó con una solución bastante simple que funcionaría en Linux como en Windows (Tal vez sea demasiado simplista, pero sí satisface la necesidad!):

srand(time(NULL)); 

sprintf(strUuid, "%x%x-%x-%x-%x-%x%x%x", 
    rand(), rand(),     // Generates a 64-bit Hex number 
    rand(),       // Generates a 32-bit Hex number 
    ((rand() & 0x0fff) | 0x4000), // Generates a 32-bit Hex number of the form 4xxx (4 indicates the UUID version) 
    rand() % 0x3fff + 0x8000,  // Generates a 32-bit Hex number in the range [0x8000, 0xbfff] 
    rand(), rand(), rand());  // Generates a 96-bit Hex number 
+0

¡Claro! Gracias por apuntarme en la dirección correcta, ¡no tenía ni idea! ¡No había aceptado la respuesta porque la había ideado yo sola y me pareció demasiado simplista! – themoondothshine

+0

Su terminología es un poco confusa: el término "UUID basado en tiempo" no es versión 4 sino versión 1. Desde el punto de vista teórico, usar módulo 0x3fff no le daría una distribución uniforme de resultados, aunque dudo que tenga alguna práctica trascendencia. – oferei

2

No existe una llamada al sistema en POSIX para generar UUID, pero supongo que puede encontrar en algún lugar un código BSD/MIT para generar el UUID. ooid se publica bajo la licencia del software Boost, que según Wikipedia, es una licencia permisiva al estilo de BSD/MIT. Luego puede pegarlo en su aplicación, sin necesidad de agregar dependencias.

3

¿Hay alguna razón por la que no pueda simplemente enlazar estáticamente a libuuid?

+0

Utilizo libuuid en Mac OS X también. Funciona bien. – Dan

+0

libuuid parece ser LGPL, por lo que la aplicación de OP también debería ser LGPL. La vinculación dinámica evita el requisito de licencia. [Fuente] (http://linux.die.net/man/3/libuuid). A menos que estés hablando de un libuuid diferente. – tjameson

9

Me estoy perdiendo ¿alguna cosa? ¿No puedes:

cat /proc/sys/kernel/random/uuid 
+0

Puede no ser portátil para otros sistemas Linux. – osa

5

Una buena manera que he encontrado (por dev Linux) es #include <uuid/uuid.h>. Luego tiene algunas funciones que puede llamar:

void uuid_generate(uuid_t out); 
void uuid_generate_random(uuid_t out);