2009-09-03 13 views
10

Mi sento come se domande GUID/UUID siano state fatte a morte qui, ma non riesco a trovare abbastanza quello che sto cercando. Ho bisogno di una funzione che generi GUID V4 in C, cioè qualcosa che sia essenzialmente compatibile con Guid.NewGuid di C#.Semplice generazione di GUID in C

Questo deve funzionare su Windows (XP, Server 2003/8, ecc.) E 3 diverse distribuzioni di Unix (AIX, Sun e HP).

Ho visto alcuni dei white paper sulle specifiche, alcuni che hanno anche alcune implementazioni di esempio, ma sembra esserci sempre un problema con numeri casuali appropriati, o generano solo UUID V1 o V3, ecc. Il wikipedia page per Gli UUID mi hanno indirizzato verso un paio di librerie di esempio, ma queste sono troppo pesanti per quello che sto cercando di realizzare qui.

Mi sento piuttosto forte di poter implementare qualcosa da solo, ma non voglio perdere tempo a reinventare la ruota se c'è qualcosa di veramente semplice e leggero che potrei semplicemente inserire. Qualcuno ha qualcosa o sa qualcosa?

Grazie.

risposta

10

CoCreateGuid è standard per tutte le forme di Windows. Lo standard Linux è libuuid, che è standard su tutte le versioni di Linux e dovrebbe essere leggero. Non conosco alcuna libreria che funzioni sia per Windows che per Unix. Penso che un ramo #if per Windows e Linux sia effettivamente appropriato qui.

+1

È effettivamente necessario distribuire lo stesso binario su entrambi i sistemi? O semplicemente compila la stessa fonte? La tua domanda non specifica. Se hai davvero bisogno di distribuire lo stesso binario, puoi probabilmente ottenere il sorgente per libuuid e compilarlo nel tuo binario, il che lo renderà multipiattaforma. –

+3

@Morinar: questo * è * indipendente dalla piattaforma. Si avvolgono sotto un'interfaccia comune alcune API specifiche del sistema operativo. Alla fine, sarà necessario compilare l'applicazione in ogni categoria di SO, quindi è necessario compilare il time switch per selezionare la corretta implementazione della stessa interfaccia. Alcune buone librerie che conosco usano questo "trucco". Vedi boost :: thread per esempio. –

+0

Basta compilare la stessa fonte ... un ramo #if è perfettamente accettabile. È una garanzia che le mie distribuzioni Unix avranno libuuid? Non ho davvero la possibilità di forzare tutti i nostri clienti a installarlo o persino a comprimerlo correttamente. – Morinar

2

Infatti CoCreateGuid() chiama UuidCreate(). I tipi di dati generati (UUID,GUID) sono esattamente gli stessi. Su Windows è possibile utilizzare entrambe le funzioni per creare GUID