2010-09-18 7 views
8

Ho appena generato alcuni milioni di GUID trasformandoli in una stringa e ottenuto la lunghezza ... è sempre stato lo stesso. Posso fare affidamento su questa lunghezza fissa del GUID durante la conversione in String?Domande sui GUID: sono sempre sistemati in lunghezza e il numero medio è sempre 4?

Inoltre, il numero medio del GUID è sempre "4" come mostrato in questa schermata?

alt text

+0

È possibile fare affidamento solo su ciò che le specifiche dicono sul GUID. Se la specifica non menziona una rappresentazione di stringa a lunghezza fissa, quindi non fare affidamento su di essa. –

+0

@Keith - Il formato 8-4-4-4-12 è lo standard, sia con MS che con OSF. I documenti MS dicono di Guid.ToString() "Il valore di questo Guid, formattato come segue: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" –

+0

Ok, allora sei bravo. –

risposta

8

Sì, la lunghezza è fisso e sì, il numero centrale è sempre 4 quando si utilizza il formato tostring standard. Alcuni dei bit in GUID (noto come un UUID quasi ovunque che non è finestre) sono fissate per indicare cose come versione ecc ..

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

EDIT Vorrei aggiungere che il "4 "si applica solo ai Guids che sono stati generati secondo l'algoritmo Guid.NewGuid come implementato in .NET. Non vi è nulla che impedisca di prendere byte arbitrari [16] e convertirli in Guid. Quindi, è possibile contare solo su 4 per l'attuale implementazione dell'algoritmo in .Net. Se stai ricevendo Guidi da un'altra fonte, non puoi fare affidamento sul 4. Un aggiornamento a .Net o eventualmente a Windows (a seconda che .Net usi il proprio o generatore di Windows) potrebbe cambiare i numeri fissi del GUID

es il seguente è codice completamente funzionante e non avrà il 4 in posizione:

 var rand = new Random(); 
     var byteArray = new byte[16]; 
     rand.NextBytes(byteArray); 
     var g = new Guid(byteArray); 
+1

Il 4 è il numero di versione. Dipende da come è stato generato, * non * come lo converti in una stringa. – Gabe

+0

Se il GUID è stato visualizzato come numero di base 10, non ci sarebbe mai un 4 in quella posizione. Intendiamoci, farlo sarebbe folle, è solo che POTREI. – mjfgates

+1

@Gabe - per accorciare la lunghezza della stringa, un trucco semi-comune è eseguire una conversione di base 64, nel qual caso la stringa non avrebbe il 4 in posizione, nasconderebbe i valori fissi. ad esempio: Convert.ToBase64String (guid.ToByteArray()); –

3

Dal documentation on Guid.ToString (senza parametri):

Il valore di questo GUID, formattati come segue: xxxxxxxx -xxxx-xxxx-xxxx-xxxxxxxxxxxx in cui il valore del GUID è rappresentato come una serie di minuscole cifre esadecimali in gruppi di 8, 4, 4, 4, e 12 cifre e separati da trattini. Un esempio di un valore restituito è "382c74c3-721d-4f34-80e5-57657b6cbc27".

Quindi la risposta è "sì", sarà sempre avere la stessa lunghezza.

Come per il 4, è un numero di versione (secondo http://en.wikipedia.org/wiki/Uuid). Ogni GUID generato con quell'algoritmo avrà un 4 in quella posizione, ma i GUID meno recenti avranno un 1, 2 o 3. Quelli futuri potrebbero avere un 5 o qualcosa di più.

2

No - un GUID non deve essere un tipo 4 UUID infatti molte GUID sotto le finestre sono UUID del di tipo 1.

tipo 1 prende il primario MAC, un orologio e una sequenza. Si tratta infatti di dati "Leaks" poiché tutti gli UUID1 creati sullo stesso sistema avranno lo stesso MAC. Questo è il motivo per cui la maggior parte delle funzioni GUID prenderà questi dati e li cancellerà e li trasformerà in un UUID basato su hash