Formato UUID: 8-4-4-4-12 - Perché?


85

Perché gli UUID sono presentati nel formato "8-4-4-4-12" (cifre)? Ho dato un'occhiata in giro per il motivo, ma non riesco a trovare la decisione che lo richiede.

Esempio di UUID formattato come stringa esadecimale: 58D5E212-165B-4CA0-909B-C86B9CEE0111


12
In realtà, quell'esempio di stringa esadecimale non è corretto. La specifica UUID richiede che la stringa esadecimale che rappresenta un valore UUID deve essere in lettere minuscole . La specifica richiede anche un'implementazione per poter analizzare una stringa maiuscola o mista, ma è possibile generare solo lettere minuscole. Purtroppo le implementazioni comuni violano questa regola, comprese quelle di Apple, Microsoft e altri.
Basil Bourque

1
Interessante Basil, grazie
Fidel

Risposte:


66

È separato da time, version, clock_seq_hi, clock_seq_lo, node, come indicato nel seguente rfc.

Da IETF RFC4122:

4.1.2.  Layout and Byte Order

   To minimize confusion about bit assignments within octets, the UUID
   record definition is defined only in terms of fields that are
   integral numbers of octets.  The fields are presented with the most
   significant one first.

   Field                  Data Type     Octet  Note
                                        #

   time_low               unsigned 32   0-3    The low field of the
                          bit integer          timestamp

   time_mid               unsigned 16   4-5    The middle field of the
                          bit integer          timestamp

   time_hi_and_version    unsigned 16   6-7    The high field of the
                          bit integer          timestamp multiplexed
                                               with the version number  

   clock_seq_hi_and_rese  unsigned 8    8      The high field of the
   rved                   bit integer          clock sequence
                                               multiplexed with the
                                               variant

   clock_seq_low          unsigned 8    9      The low field of the
                          bit integer          clock sequence

   node                   unsigned 48   10-15  The spatially unique
                          bit integer          node identifier

   In the absence of explicit application or presentation protocol
   specification to the contrary, a UUID is encoded as a 128-bit object,
   as follows:

   The fields are encoded as 16 octets, with the sizes and order of the
   fields defined above, and with each field encoded with the Most
   Significant Byte first (known as network byte order).  Note that the
   field names, particularly for multiplexed fields, follow historical
   practice.

   0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                          time_low                             |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |       time_mid                |         time_hi_and_version   |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |clk_seq_hi_res |  clk_seq_low  |         node (0-1)            |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                         node (2-5)                            |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

11
Perché il timestamp è stato suddiviso in tre parti?
user253751

4
Il modo in cui vengono generati i campi dipende dalla versione dell'UUID. Il metodo preferito non utilizza il tempo poiché rivela l'ora in cui è stato generato l'ID (un potenziale problema di sicurezza). en.wikipedia.org/wiki/…
pmont

1
@pmont "Preferred"?
Basil Bourque

2
@Brocoli non sono d'accordo. V4 dipende da un generatore di numeri casuali crittograficamente potente, che è molto più difficile da costruire bene che semplicemente afferrare l' indirizzo MAC , il momento corrente e un numero arbitrario incrementale, come si vede nell'UUID V1. Inoltre, le implementazioni di V1 sono generalmente open-source e costruite molti anni fa con molto utilizzo in tutto il settore, ormai usurate. Affermare che V1 è "incline al fallimento parziale" è semplicemente sciocco. Un UUID V1 è l' ultimo pezzo del tuo sistema in cui devi preoccuparti del fallimento.
Basil Bourque

2
@BasilBourque Uno dei problemi che puoi vedere ora con la proliferazione di container e il networking dei container sono gli indirizzi MAC in conflitto. In genere i contenitori e le VM estraggono da un intervallo limitato di possibili indirizzi MAC. IIRC Hyper-V esegue il pull solo da un pool di 256 possibili indirizzi MAC per impostazione predefinita.
Nathan Clayton

12

Il formato è definito in IETF RFC4122 nella sezione 3. Il formato di output è definito dove dice "UUID = ..."

3.- Modello di registrazione dello spazio dei nomi

ID spazio dei nomi: UUID Informazioni di registrazione: Data di registrazione: 2003-10-01

Registrante dichiarato dello spazio dei nomi: JTC 1 / SC6 (ASN.1 Rapporteur Group)

Dichiarazione della struttura sintattica: un UUID è un identificatore univoco sia nello spazio che nel tempo, rispetto allo spazio di tutti gli UUID. Poiché un UUID è di dimensioni fisse e contiene un campo temporale, è possibile che i valori cambino (intorno a AD 3400, a seconda dell'algoritmo specifico utilizzato). Un UUID può essere utilizzato per molteplici scopi, dalla codifica di oggetti con una durata estremamente breve, all'identificazione affidabile di oggetti molto persistenti in una rete.

  The internal representation of a UUID is a specific sequence of
  bits in memory, as described in Section 4.  To accurately
  represent a UUID as a URN, it is necessary to convert the bit
  sequence to a string representation.

  Each field is treated as an integer and has its value printed as a
  zero-filled hexadecimal digit string with the most significant
  digit first.  The hexadecimal values "a" through "f" are output as
  lower case characters and are case insensitive on input.

  The formal definition of the UUID string representation is
  provided by the following ABNF [7]:

  UUID                   = time-low "-" time-mid "-"
                           time-high-and-version "-"
                           clock-seq-and-reserved
                           clock-seq-low "-" node
  time-low               = 4hexOctet
  time-mid               = 2hexOctet
  time-high-and-version  = 2hexOctet
  clock-seq-and-reserved = hexOctet
  clock-seq-low          = hexOctet
  node                   = 6hexOctet
  hexOctet               = hexDigit hexDigit
  hexDigit =
        "0" / "1" / "2" / "3" / "4" / "5" / "6" / "7" / "8" / "9" /
        "a" / "b" / "c" / "d" / "e" / "f" /
        "A" / "B" / "C" / "D" / "E" / "F"

4

128 bit

Il formato "8-4-4-4-12" è solo per la lettura da parte degli esseri umani. L' UUID è in realtà un numero a 128 bit .

Considera che il formato della stringa richiede il doppio dei byte rispetto al numero di 128 bit quando è archiviato o in memoria. Suggerirei di utilizzare il numero internamente e quando deve essere visualizzato su un'interfaccia utente o esportato in un file, utilizzare il formato stringa.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.