UUID
Il GUID (Globally Unique IDentifier), identificatore unico globale, è un numero pseudo-casuale usato nella programmazione software, per poter distinguere in modo inequivocabile vari oggetti. Il tipo più noto di GUID si chiama UUID (Uuniversally Unique IDentifier), ideato dalla Open Software Foundation ed utilizzato anche da Microsoft.
Tradizionalmente il meccanismo per garantire l'unicità di un codice comporta una qualche forma di autorità centrale, o di una gerarchia di autorità, che assegna o approva gli identificativi. Si tratta di un sistema piuttosto costoso, che implica tra l'altro che la richiesta di un nuovo ID unico richieda del tempo, anche diversi giorni, per essere soddisfatta.
Pare che l'idea di generare un identificativo unico senza bisogno di un registro centrale si sia manifestata per la prima volta nella progettazione di un sistema operativo chiamato Apollo Network Computing System alla fine degli anni '80, ed è stata poi definita in maniera più formale, trasformandosi negli UUID che tutti conosciamo, all'interno del Distributed Computing Environment della Open Software Foundation all'inizio degli anni '90.
Nel caso non ne abbiate mai visto uno, un UUID è un numero di 128 bit rappresentato come 32 cifre esadecimali, divise in cinque gruppi di 8-4-4-4-12 bit separati da trattini. Eccone un esempio:
5cd50690-857a-4b72-a526-e3a22a686bbc
La prima versione degli UUID veniva generata concatenando l'indirizzo MAC della scheda di rete della macchina generatrice con il timestamp alla risoluzione di 100 nanosecondi. Ricordiamo che l'indirizzo MAC è formato da 6 byte, i cui primi 3 (24 bit) identificano univocamente il produttore della scheda di rete con un codice che viene assegnato dall'IEEE, che è un ente OUI (Organisationally Unique Identifier). Gli altri 3 byte (24 bit) vengono, invece, assegnati dal produttore delle schede per identificarle una per una.
Su Linux è possibile generare un UUID versione 1 con il comando:
uuidgen -t
Nel risultato ottenuto:
5a21f5d0-8aad-11e3-bc3c-0019666542e6
facciamo notare la prima cifra del terzo gruppo (1) che rappresenta la versione dell'identificatore, e l'intero quinto gruppo (0019666542e6) che rappresenta l'indirizzo MAC della scheda di rete del computer. Continuando a generare identificatori UUID con il metodo precedente, le cifre evidenziate rimarranno sempre le stesse.
Questo algoritmo forniva l'assoluta certezza dell'univocità dell'UUID generato (perché non esistono due indirizzi MAC uguali), ma in questo modo risulterebbe possibile risalire da un UUID al computer che l'ha generato, con potenziali conseguenze sulla privacy e sulla sicurezza.
Nell'esempio precedente si possono avere immediatamente le informazioni sul produttore della scheda, infatti utilizzando le prime 6 cifre del quinto gruppo 001966, tramite il sito della OUI, si ottiene:
00-19-66 (hex) Asiarock Technology Limited 001966 (base 16) Asiarock Technology Limited P.O. Box957, Offshore Incorporations Centre Road Town Tortola VIRGIN ISLANDS, BRITISH
Dopo che venne alla luce questo problema l'algoritmo di generazione venne modificato in modo da slegarlo dagli indirizzi MAC. Questa nuova versione di UUID è identificata dal numero 4, e può essere ottenuta in Linux con il comando:
uuidgen -r
Nel risultato:
d6ccb8d3-1876-436b-88e1-33162bf57c2b
solo la prima cifra del terzo gruppo (4), che rappresenta la versione dell'identificatore, rimane costante ad ogni nuova generazione.
Quindi per sapere se un UUID è stato generato con la prima o con la seconda versione dell'algoritmo, basta fare riferimento alla prima cifra del terzo blocco.
Anche in ambito Microsoft, dove gli UUID vengono utilizzati, prevalentemente all'interno del Registro di Sistema, per l'identificazione di componenti software COM ed altro, esistono 2 API distinte per generare gli UUID: UuidCreateSequential per gli UUID versione 1, e UuidCreate per la versione 4.
In ambito Linux è anche possibile ottenere identificatori UUID di quarta generazione, tramite lo stesso kernel, con il comando:
cat /proc/sys/kernel/random/uuid
L'unicità degli UUID versione 4 non può essere garantita in assoluto, anche se la pura forza bruta dell'aritmetica combinatoria costituisce un argomento convincente. Per citare Wikipedia, dopo aver generato due trilioni di UUID (si tratta di circa 300 per ogni persona sul pianeta) la probabilità di una collisione e 0,0000000000004, che è piuttosto bassa. Affinché la probabilità di una singola collisione (2 UUID identici) salga al 50% ogni persona dovrebbe generare 600 milioni di UUID.
In Linux gli UUID vengono utilizzati anche per identificare in modo univoco le partizioni dei dischi; quante volte sarà capitato di leggere il file /etc/fstab e notare quelle illeggibili e lunghe stringhe esadecimali al posto di molto più comprensibili e rassicuranti /dev/sda3 o /dev/sdb5?
Con il comando seguente, dato come amministratore:
blkid
si ottengono informazioni dettagliate sulle associazioni tra UUID e partizioni:
............ /dev/sda1: LABEL="ReLivix2012" UUID="357e4b00-07ad-463e-a088-ae1c7688613b" TYPE="reiserfs" ............ /dev/sdb5: UUID="e97409ab-0db0-43cc-bd96-ecbde1f4e24d" TYPE="reiserfs"Qualcuno, nel tentativo di ricordarli, tenta di leggerci dentro qualche recondito messaggio sostituendo mentalmente: 0 con O, 1 con L, 5 con S, 7 con T. E quindi il seguente strano UUID
Appendice
ls -l /dev/disk/by-uuid
blkid /dev/sda1
restituisce:
/dev/sda1: LABEL="ReLivix2012" UUID="357e4b00-07ad-463e-a088-ae1c7688613b" TYPE="reiserfs"
hwinfo --block |grep uuid
.......... Device Files: /dev/sda1, /dev/disk/by-id/ata-ST500DM002-1BC142_Z2APTWGT-part1, /dev/disk/by-id/scsi-SATA_ST500DM002-1BC1_Z2APTWGT-part1, /dev/disk/by-id/wwn-0x5000c500403f2e5d-part1, /dev/disk/by-label/ReLivix2012, /dev/disk/by-path/pci-0000:00:1f.2-scsi-0:0:0:0-part1, /dev/disk/by-uuid/357e4b00-07ad-463e-a088-ae1c7688613b ..........
udevadm info -q all -n /dev/sda1 |grep uuid
S: disk/by-uuid/357e4b00-07ad-463e-a088-ae1c7688613b E: DEVLINKS=/dev/disk/by-id/ata-ST500DM002-1BC142_Z2APTWGT-part1 /dev/disk/by-id/scsi-SATA_ST500DM002-1BC1_Z2APTWGT-part1 /dev/disk/by-id/wwn-0x5000c500403f2e5d-part1 /dev/disk/by-label/ReLivix2012 /dev/disk/by-path/pci-0000:00:1f.2-scsi-0:0:0:0-part1 /dev/disk/by-uuid/357e4b00-07ad-463e-a088-ae1c7688613b
tune2fs /dev/sda1 -U f0acce91-a416-474c-8a8c-43f3ed3768f9se si vuole impostare un proprio UUID noto, altrimenti lo facciamo generare al volo con:
tune2fs /dev/sda1 -U `uuidgen -r`facendo attenzione ad usare gli apici rovesciati.
Le piccole gioie, non quelle grandi, ci servono da sollievo e da conforto quotidiano.
Hermann Hesse