Sempre più frequentemente mi trovo a dover sviluppare software di gestione molto articolati e complessi. Progetti ingegnerizzati in modo da renderli un insieme di richieste ad oggetti.

Questo genera un problema non da poco, in quanto molte volte si vorrebbe in qualche modo distinguere ogni oggetto da tutti gli altri in maniera univoca ed allo stesso tempo rendere l’informazione codificata.

Da tempo sapevo dell’esistenza di particolari strutture di codici, gli UUID. Una versione modificata è fortemente utilizzata dalla Microsoft per identificare i tipi di file (, ndr.).

Il funzionamento è semplice e da una quasi certezza di avere un codice univoco; vediamo subito perché.

Il codice è strutturato in un numero a 128-bit, ciò significa che ci sono 2128 combinazioni diverse recuperabili, vale a dire circa 1 di UUID unici. Tale numero poi viene espresso in formato esadecimale raggruppandoli nel seguente modo: 2ee2b3df-8386-41d2-b143-0a4dbf3ad748.

L’intero codice, come si può vedere, è suddiviso in 5 gruppi separati da un trattino. Il primo gruppo è di 8 caratteri; il secondo, il terzo ed il quarto è di 4 e l’ultimo di 12 caratteri.

Quasi tutti i linguaggi di programmazione hanno sistemi in grado di generare numeri casuali, ma generare un numero a 128-bit è mission impossible per la maggioranza di noi.

Una soluzione che ho trovato è stata quella di suddividere il numero in numeri più piccoli: mi spiego meglio.

Per intero, il codice UUID è formato da 32 caratteri. Inoltre, una coppia di caratteri in esadecimale è pari a 255 in decimale. Per cui, si possono generare 16 coppie di esadecimali (16*2 = 32, ndr.) e poi mettere tutto insieme. Alla fine di questo processo avremo i 32 caratteri, pari ad un numero a 128-bit. Non ci resta che suddividerli secondo lo schema precedentemente spiegato.

Uno stralcio di codice, in PHP, potrebbe essere il seguente:

$uuid_structure = array(8, 4, 4, 4, 12); 
for ($i = 0; $i != count($uuid_structure); $i++) { 
        $uuid.= $hyphens; 
        for ($k = 0; $k != ($uuid_structure[$i] / 2); $k++) { 
                $uuid .= str_pad(dechex(rand(0,255)), 2, '0′, STR_PAD_RIGHT); 
        } 
        $hyphens = '-'; 
}

Ovviamente questo codice lo si può inserire in una funzione richiamabile da qualsiasi posizione.

Esiste anche un sito che permette di registrare il nostro UUID/GUID così che, se qualcuno lo incontra e vuole sapere a quale applicazione si riferisce, può fare il lookup.