2010-02-01 12 views
7

Sono bloccato in una strana situazione. Ho bisogno di generare UUID nel mio programma Linux (che distribuisco usando RPM). Non voglio aggiungere un'altra dipendenza alla mia applicazione richiedendo all'utente di installare libuuid (sembra che libuuid non sia incluso nella maggior parte delle distribuzioni Linux, come CentOS).Generazione di UUID casuali in Linux

Non c'è una chiamata di sistema Linux standard che genera UUID (come diciamo, in Windows c'è CoCreateGuid)? Che cosa usa il comando uuidgen?

+0

uuidgen usa libuuid. –

risposta

5

Grazie per tutti i vostri commenti!

sono andato attraverso ciascuno, ed ecco cosa adatta la mia richiesta il meglio:

Quello che mi serviva era solo UUID basati sul tempo di pianura, che sono stati generati da numeri casuali una volta per ogni utente che ha installato l'applicazione. UUID versione 4 come specificato nella RFC 4122 era esattamente questo. Ho passato un l'algoritmo suggerito, e si avvicinò con una soluzione molto semplice che lavorerebbe in Linux e di Windows (Forse è troppo semplicistico, ma lo fa soddisfare il bisogno!):

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

Sicuro! Grazie per avermi indicato nella giusta direzione, non ne avevo idea! Non avevo accettato la risposta perché l'avrei inventata da sola e l'ho pensata troppo semplicistica !! – themoondothshine

+0

La terminologia è un po 'confusa - il termine "UUID basato sul tempo" non è la versione 4 ma la versione 1. Dal punto di vista teorico, l'uso del modulo 0x3fff non fornisce una distribuzione uniforme degli output, anche se dubito che avrebbe qualche implicazioni. – oferei

2

Nessuna chiamata di sistema esiste in POSIX per generare UUID, ma suppongo che sia possibile trovare da qualche parte un codice BSD/MIT per generare l'UUID. ooid è rilasciato sotto la licenza del software Boost, che secondo wikipedia è una licenza permissiva nello stile di BSD/MIT. Quindi puoi semplicemente incollarlo nella tua applicazione, senza bisogno di aggiungere dipendenze.

3

C'è qualche ragione per cui non si può semplicemente collegare staticamente a libuuid?

+0

Io uso libuuid anche su Mac OS X. Funziona bene. – Dan

+0

libuuid sembra essere LGPL, quindi l'applicazione dell'OP dovrebbe anche essere LGPL. Il collegamento dinamico evita il requisito della licenza. [Fonte] (http://linux.die.net/man/3/libuuid). A meno che tu non stia parlando di un diverso libuuid. – tjameson

9

Manco qualcosa? Non è possibile:

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

Potrebbe non essere portabile ad altri sistemi Linux. – osa

5

Un buon modo che ho trovato (per linux dev) è a #include <uuid/uuid.h>. Quindi hai alcune funzioni che puoi chiamare:

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