Ta strona jest automatycznie tłumaczona na wiele języków za pomocą oprogramowania stworzonego przez Kohei Koyanagi. Dla najwyższej dokładności zajrzyj do oryginału w angielskim .

Dwutorowe podejście Splync: UUID i autoinkrementowane liczby całkowite

Splync używa dwóch identyfikatorów dla wrażliwych ID

W bazie danych Splync każdy użytkownik i każdy projekt mają dwa różne identyfikatory: UUID oraz autoinkrementowaną liczbę całkowitą. Autoinkrementowana liczba całkowita to po prostu licznik: 1, 2, 3 i tak dalej. Splync wykorzystuje te liczby w serwerowej bazie danych do organizacji prawie wszystkich tabel, ponieważ są proste, szybkie i efektywne w łączeniach. Nigdy jednak nie ujawniamy tych wewnętrznych numerów w aplikacji. Na przykład, jeśli jesteś 42. użytkownikiem, który się zarejestrował, twój wewnętrzny ID w bazie danych to 42. Ale twoja aplikacja iOS nigdy nie zobaczy „42”. Zamiast tego, aplikacja używa UUID, aby cię reprezentować. To samo podejście stosujemy do projektów — ID projektu może być „7” w bazie danych, ale aplikacja zawsze odnosi się do niego za pomocą długiego UUID.

Co to jest UUID

UUID to skrót od Universally Unique Identifier. Splync używa UUID w wersji 4, wariantu 1, zgodnych z RFC 4122 — jednym z najczęściej stosowanych standardów. Jest to losowo generowany ciąg znaków, który wygląda jak 949ca11c-a6ed-48a3-b40a-fa9727494917. UUID jest zwykle zapisywany jako 32 znaki szesnastkowe podzielone na pięć sekcji oddzielonych myślnikami. Jest zaprojektowany, by być unikalny globalnie, co oznacza, że nie koliduje nawet na różnych serwerach czy bazach danych. Matematycznie istnieje około 16^32 = 2^128 możliwych kombinacji. Jednak, ponieważ sześć bitów jest zarezerwowanych na wariant i wersję, całkowita liczba unikalnych UUID wersji 4, wariantu 1 wynosi około 2^122, czyli około 5,3 x 10^36 — astronomicznie duża liczba zapewniająca praktyczną unikalność.

Jak mała jest 1 / 5,300,000,000,000,000,000,000,000,000,000,000,000

Każda para UUIDv4 ma około 1 na 5,3 × 10^36 szans na dopasowanie. Ta liczba jest tak mała, że prawie nie mieści się w ludzkiej wyobraźni. Aby to sobie wyobrazić, pomyśl o rzucaniu 47 kostkami naraz. Szansa, że uzyskasz same jedynki, wynosi około 1 na 6^47, czyli około 1 na 3,7 × 10^36. To ten sam rząd wielkości, co kolizja UUID. Teraz wyobraź sobie, że każda osoba na Ziemi — około osiem miliardów z nas — rzuca te 47 kostek co milisekundę przez bilion lat. To około 2,5 × 10^32 prób. Nawet po tym wszystkim szansa, że ktoś gdzieś uzyska 47 jedynek naraz, wynosiłaby tylko jeden na dziesięć tysięcy. To pokazuje, jak mało prawdopodobne jest, aby dwa UUIDv4 się zderzyły. To nie jest „rzadkie”. To kosmicznie absurdalne — taki zbieg okoliczności, który sprawiłby, że matematycy porzuciliby kawę i zaczęli sprawdzać, czy wszechświat nie ma błędów.

Czy łatwo jest wygenerować UUID

Na pierwszy rzut oka generowanie UUID może wydawać się proste — w końcu to po prostu losowo wyglądający ciąg alfanumeryczny. Ale spróbuj napisać jeden samodzielnie długopisem na papierze. Oczywiście możesz zapisać 36 znaków, ale gdy powtórzysz to ćwiczenie tysiące razy, wyłonią się wyraźne wzorce. Być może preferujesz pewne cyfry, jak 3 lub 8, i rzadko używasz liter, jak x. Komputer wykryje te uprzedzenia natychmiast. Złośliwy haker mógłby analizować twoje nawyki i zawęzić twój „losowy” tajny ciąg w ciągu dnia. A co jeśli użyjesz komputera i funkcji rand(), klasycznej funkcji losowej, do generowania każdej cyfry? To lepsze — ale nie wystarczająco dobre. Wiele „losowych” generatorów liczb w powszechnych środowiskach programistycznych jest pseudolosowych, co oznacza, że śledzą one przewidywalną sekwencję matematyczną zaczynającą się od wewnętrznego ziarna, które zazwyczaj opiera się na czasie systemowym. Jeśli ktoś odkryje lub zgadnie to ziarno, może odtworzyć każdą wartość, którą twój generator kiedykolwiek wytworzył.

Jak bardzo losowy jest UUID

Idealna losowość nie istnieje — tak samo jak nie istnieje idealna kostka, czy idealny rzut kostkami. Każdy proces fizyczny czy cyfrowy podąża za pewnymi podstawowymi zasadami. Niemniej jednak matematycy i inżynierowie spędzili dekady na projektowaniu algorytmów, które zbliżają się jak najbliżej do prawdziwej losowości. Kiedy Splync tworzy nowy UUID wersji 4, nie wybiera po prostu „liczb losowo” jak podczas rzutu kostką. Pyta system operacyjny o maleńkie ślady nieprzewidywalności — na przykład o precyzyjny moment, w którym CPU kończy zadanie, słabe szumy elektryczne w sprzęcie lub fluktuacje czasowe w pamięci. Te fragmenty entropii są zbierane i mieszane w 128 bitach danych — długim ciągu jedynek i zer. W rezultacie powstaje kod, który dla użytkowników aplikacji lub potencjalnych złośliwych atakujących jest praktycznie niemożliwy do odgadnięcia lub powtórzenia.

Dwutorowe podejście Splync

Splync używa UUID dla wrażliwych identyfikatorów, takich jak ID użytkowników i projektów, ponieważ są one niezwykle losowe i bezpieczne. Jednocześnie, wewnątrz swojego serwera, Splync konwertuje te UUID na autoinkrementowane liczby całkowite, aby przyspieszyć wyszukiwanie i analizę dużych zestawów danych. To dwutorowe podejście równoważy bezpieczeństwo i wygodę — zewnętrzną prywatność z wewnętrzną wydajnością. Celem Splync jest być bezstresową, prostą i bezpieczną aplikacją do śledzenia budżetu. Za widocznym interfejsem użytkownika wciąż udoskonalamy naszą architekturę, aby wszystko działało płynnie, bezpiecznie i dyskretnie inteligentnie.