Splync folosește doi identificatori pentru ID-uri sensibile
În baza de date a lui Splync, fiecare utilizator — și fiecare proiect — este identificat prin două ID-uri diferite: un UUID și un număr întreg auto-incrementat.
Numărul întreg auto-incrementat este cel mai cunoscut — este doar un contor: 1, 2, 3 și așa mai departe. Splync folosește aceste numere întregi în baza de date a serverului pentru a organiza aproape fiecare tabel deoarece sunt simple, rapide și eficiente pentru legături. Totuși, nu expunem niciodată aceste numere interne în aplicație. De exemplu, dacă ești al 42-lea utilizator înscris, ID-ul tău intern în baza de date ar fi 42. Dar aplicația ta iOS nu va vedea „42”. În schimb, aplicația folosește un UUID pentru a te reprezenta. Aplicăm aceeași abordare și pentru proiecte — un ID de proiect ar putea fi „7” în baza de date, dar aplicația se referă mereu la acesta folosind un UUID lung.
Ce este un UUID
UUID înseamnă Identificator Unic Universal. Splync folosește UUID-uri de versiunea 4, varianta 1, conforme cu RFC 4122 — unul dintre cele mai larg acceptate standarde. Este un șir generat aleator, care arată ca 949ca11c-a6ed-48a3-b40a-fa9727494917. Un UUID este de obicei scris ca 32 de caractere hexazecimale împărțite în cinci secțiuni separate prin cratime. Este conceput să fie unic la nivel global, adică nu va intra în conflict chiar și pe servere sau baze de date diferite. Matematic, există aproximativ 16^32 = 2^128 combinații posibile. Totuși, deoarece șase biți sunt rezervate pentru a indica varianta și versiunea, numărul total de UUID-uri distincte de versiunea 4, varianta 1 este aproximativ 2^122, adică aproximativ 5,3 x 10^36 — un număr astronomic de mare care asigură unicitate practică.
Cât de mic este 1 / 5.300.000.000.000.000.000.000.000.000.000.000.000
Fiecare pereche de UUIDv4 are cam 1 la 5,3 × 10^36 șanse să se potrivească. Acest număr este atât de mic încât aproape refuză să existe în imaginația umană. Pentru a-l vizualiza, imaginează-ți că arunci 47 de zaruri deodată. Șansele să obții doar unu — fiecare zar să arate „1” — sunt de aproximativ 1 la 6^47, sau aproximativ 1 la 3,7 × 10^36. Aceasta este de aceeași ordine de mărime ca o coliziune UUID. Acum, imaginează-ți fiecare persoană de pe Pământ — aproximativ opt miliarde dintre noi — aruncând acele 47 de zaruri în fiecare milisecundă timp de un trilion de ani. Sunt cam 2,5 × 10^32 încercări totale. Chiar și după toate acestea, șansa ca cineva, undeva, să obțină 47 de unu deodată ar fi tot de unul la zece mii. Atât de puțin probabil este ca două UUIDv4 să se ciocnească. Nu este „rar”. Este cosmic de absurd — genul de coincidență care ar face matematicienii să-și scape cafeaua și să verifice dacă universul are erori.
Este ușor să generezi un UUID
La prima vedere, generarea unui UUID ar putea părea simplă — la urma urmei, este doar un șir alfanumeric care pare aleator. Dar încearcă să scrii unul singur cu pixul pe hârtie. Poți nota 36 de caractere, desigur, dar dacă repeți exercițiul de mii de ori, vor apărea tipare clare. Poate favorizezi anumite cifre ca 3 sau 8 și folosești rar litere ca x. Un computer poate detecta aceste preferințe instantaneu. Un hacker rău intenționat ar putea analiza obiceiurile tale și să îți restrângă șirul „aleator” secret într-o zi. Apoi, dacă folosești și un computer și apelezi rand(), funcția clasică de generare aleatorie, pentru a genera fiecare cifră. E mai bine — dar nu suficient de bine. Multe generatoare de numere „aleatoare” în medii obișnuite de programare sunt pseudorandom, adică urmează o secvență matematică previzibilă care pornește de la un seed intern, care este de obicei bazat pe ora sistemului. Dacă cineva descoperă sau ghicește acel seed, poate reproduce fiecare valoare pe care generatorul tău a produs-o vreodată.
Cât de perfect aleator este un UUID
Aleatorietatea perfectă nu există cu adevărat — la fel cum un zar perfect nu există sau o aruncare perfect aleatorie de zaruri nu există. Fiecare proces fizic sau digital urmează niște reguli subiacente. Totuși, matematicienii și inginerii au petrecut decenii proiectând algoritmi care se apropie cât mai mult de adevărata aleatorietate. Când Splync creează un nou UUID de versiunea 4, nu „alege pur și simplu numere la întâmplare” ca la aruncarea zarurilor. Cere sistemului de operare urme mici de imprevizibilitate — de exemplu, momentul precis când CPU-ul tău termină o sarcină, zgomotul electric slab din hardware sau fluctuațiile de timp de fundal în memorie. Aceste fragmente de entropie sunt colectate și amestecate în 128 de biți de date — un lung șir de unu și zero. Rezultatul este un cod care este practic imposibil de ghicit sau repetat pentru utilizatorii aplicației sau pentru eventualii atacatori rău intenționați.
Abordarea cu doi identificatori a lui Splync
Splync folosește UUID-uri pentru identificatori sensibili precum ID-urile utilizatorilor și ale proiectelor, deoarece sunt extrem de aleatorii și sigure.
În același timp, în interiorul serverului său, Splync convertește acele UUID-uri în numere întregi auto-incrementate pentru căutare și analiză mai rapidă pe seturi mari de date. Această abordare cu doi identificatori îmbină siguranța și confortul — confidențialitate externă cu performanță internă. Scopul lui Splync este să fie o aplicație de gestionare a bugetului fără stres, simplă și sigură. În spatele interfeței vizibile, continuăm să ne rafinăm arhitectura pentru a menține lucrurile fluente, sigure și inteligent discrete.