2009-09-03 10 views
10

Siento que las preguntas GUID/UUID se han hecho hasta la muerte aquí, pero parece que no puedo encontrar todo lo que estoy buscando. Necesito una función que genere GUID V4 en C, es decir, algo que sea esencialmente compatible con Guid.NewGuid de C#.Generación simple de GUID en C

Esto tiene que funcionar en Windows (XP, Server 2003/8, etc.) y 3 diferentes distribuciones de Unix (AIX, Sun y HP).

He visto algunos de los documentos técnicos de especificación, algunos que incluso tienen algunas implementaciones de muestra, pero siempre parece haber un problema con números aleatorios adecuados, o solo generan UUID V1 o V3, etc. El wikipedia page para Los UUID me indicaron un par de bibliotecas de muestra, pero estos son MUCHO peso para lo que intento lograr aquí.

Creo firmemente que podría implementar algo yo mismo, pero no quiero perder el tiempo reinventando la rueda si hay algo realmente simple y liviano que podría caer. ¿Alguien tiene algo o sabe algo?

Gracias.

Respuesta

10

CoCreateGuid es estándar para todas las formas de Windows. El estándar de Linux es libuuid, que es estándar en todas las versiones de Linux y debe ser liviano. No sé de ninguna biblioteca que funcione tanto para Windows como para Unix. Creo que una rama #if para Windows y Linux es realmente adecuada aquí.

+1

¿De verdad necesita distribuir el mismo binario en ambos sistemas? ¿O solo compila la misma fuente? Tu pregunta no especifica. Si realmente necesita distribuir el mismo binario, probablemente pueda obtener el origen de libuuid y compilarlo en su binario, lo que lo hará multiplataforma. –

+3

@Morinar: This * is * platform independent. Envuelve en una interfaz común algunas API específicas del sistema operativo. Al final, tendrá que compilar la aplicación en cada categoría de sistema operativo, por lo que el cambio de tiempo de compilación para seleccionar la implementación correcta de la misma interfaz debería hacer el trabajo. Algunas buenas bibliotecas que conozco utilizan este "truco". Ver impulso :: hilo por ejemplo. –

+0

Simplemente compila la misma fuente ... una rama #if es perfectamente aceptable. ¿Es una garantía que mis distros de Unix tendrán libuuid? Realmente no tengo la capacidad de obligar a todos nuestros clientes a instalarlo o incluso a empaquetarlo adecuadamente. – Morinar

2

De hecho, CoCreateGuid() llama al UuidCreate(). Los tipos de datos generados (UUID,GUID) son exactamente iguales. En Windows puede usar ambas funciones para crear GUID