2013-05-20 6 views
12

C'è una differenza tra Ruby's SecureRandom.uuid (Ruby 1.9.3) e la gemma UUID? L'UUID è la gemma del "vecchio" modo di fare le cose?SecureRandom.uuid vs UUID gem

Dai documenti che deduco che la gemma è più "sicura" per essere un vero UUID unico mentre SecureRandom.uuid è più una stringa casuale che ha una maggiore possibilità di non essere unica. Inoltre UUID sembra consentire una persistenza basata su file per aiutare con questo.

Quindi speravo di sentire da alcune persone con più intuizione di me in questo.

+0

La "maggiore possibilità" di non essere univoco è altamente improbabile da colpire nella pratica. Io * penso * che UUID gem sia u1 v1, e qui c'è qualcosa di vagamente correlato (ma non una risposta): http://stackoverflow.com/questions/703035/when-are-you-truly-forced-to-use- uuid-as-part-of-the-design/786541 # 786541 –

+2

In realtà risponde alla domanda abbastanza bene. La versione ruby ​​è v4, mentre la gemma è v1. La probabilità che mi imbatti in due UUID identici usando il metodo di Ruby è minima.L'utilizzo di v1 è in realtà pari a zero nel mio setup (a meno che non abbia generato 256 exobyte di uuids). "Francamente, in uno spazio applicativo singolo senza attori maligni, l'estinzione di tutta la vita sulla terra si verificherà molto prima che tu abbia una collisione, anche su un UUID versione 4, anche se stai generando un bel paio di UUID al secondo." –

+1

Anche gli UUID v1 si basano sull'unicità degli indirizzi MAC. In un mondo fortemente virtualizzato, potresti rimanere sorpreso dal fatto che l'unicità di un indirizzo mac di una scheda di rete virtuale potrebbe non essere una garanzia tanto forte quanto i bit casuali acquisiti da 'OpenSSL :: Random' – dbenhur

risposta

6

Esistono diversi metodi per generare un UUID.

Wikipedia fa un buon lavoro di elencarli.

http://en.wikipedia.org/wiki/Universally_unique_identifier

v4 UUID:

L'idea chiave su casuale, è che in realtà è molto difficile da generare quando in materia di crittografia. La maggior parte dei generatori di numeri casuali sono una formula matematica che deve solo essere LOOK casuale e che funziona bene per la maggior parte delle applicazioni. Molti programmi useranno $ pid | tempo, per generare un seme casuale.

Quale, non è molto promettente ... so a che ora è stata generata la richiesta e ci sono solo 65.534 pid. Posso capire il seme casuale da quello.

Quindi, se si semina il generatore di numeri UUIDv4 alla stessa ora (stesso secondo) con $ pid | time() su 100 macchine con i numeri PID, quindi si ha (credo) una possibilità di duplicazione 100/65536. Ciò potrebbe essere fatto abbastanza facilmente come questo

for MACH in `cat machine_list`; do ; ssh $MACH -c "restart something" & ; done 

SecureRandom:

Il codice da SecureRandom, cerca openssl, il/dev/urandom, quindi win32 ...

Durante la lettura da/dev/urandom, è molto casuale, ma se non c'è abbastanza caos nel sistema, urandom produrrà cose per fornire dati casuali. Leggendo da/dev/random, il suo 'MOLTO casuale, e se non c'è abbastanza caos,/dev/random bloccherà.

UUID:

La gemma UUID utilizza rand()

r = [rand(0x100000000)].pack "N" 

per l'indirizzo MAC.

UUID anche non fornisce v4 UUID :)

In pratica, se mai un MD5 o collisione uuid che sto comprando un biglietto della lotteria!

+0

Mentre si tratta del generatore di numeri casuali di Javascript, è un articolo molto informativo sui problemi dell'UUID "casuale". https://medium.com/@betable/tifu-by-using-math-random-f1c308c4fd9d#.k2ah5kjq1 – Daniel