Diversity w polskim IT
Charuka Herath
Charuka HerathSoftware Engineer @ Sysco LABS Sri Lanka

6 powodów, dla których NanoID jest lepszy od UUID

Poznaj 6 powodów, dla których generator identyfikatorów NanoID przewyższa swoją starszą alternatywę, czyli UUID.
4.08.20214 min
6 powodów, dla których NanoID jest lepszy od UUID

UUID, czyli Universally Unique Identifier, to jeden z najczęściej używanych identyfikatorów w rozwoju oprogramowania. Pojawiło się jednak wiele nowych alternatyw, które zagrażają jego pozycji. Na czele tych wszystkich alternatyw kroczy NanoID. W artykule tym skupimy się na wszystkich funkcjach nowego generatora - omówimy zarówno wady, jak i zalety dla lepszego zrozumienia, jak tego właściwie używać. 

O co chodzi w NanoID i jak go używać?

Jeśli chodzi o JavaScript, to generowanie UUID i NanoID jest bardzo proste. Obie te rzeczy mają pakiety npm, które znacznie Ci pomogą. Wszystko, co musisz tutaj zrobić, to zainstalować bibliotekę NanoID NPM, korzystając z komend npm i nanoid i gotowe. 

import { nanoid } from 'nanoid';
model.id = nanoid();


Czy wiedziałeś, że NanoID ma ponad 11 754 000 pobrań z NPM tygodniowo i jest 60% szybszy od UUID? Co więcej, NanoID jest prawie 7 lat młodsze od UUID i już teraz ma o wiele więcej gwiazdek na GitHubie, niż swój poprzednik. 

Poniższy graf pokazuje trendy w NPM dla NanoID oraz UUID — widzimy tendencję wzrostową dla NanoID w porównaniu do stagnacji UUID. 


https://www.npmtrends.com/nanoid-vs-uuid


Mam nadzieję, że już teraz czujesz się przekonany do skorzystania z NanoID. Niemniej jednak główna różnica między tymi dwoma identyfikatorami jest całkiem prosta — sprowadza się ona do alfabetu, z którego dany klucz korzysta. 

Ponieważ NanoID korzysta z większego alfabetu, niż UUID, to krótsze ID można wykorzystać w tym samym celu, co dłuższe UUID. 

1. NanoID ma tylko 108 bajtów

Kod NanoID jest 4.5 raza mniejszy od UUID. Redukcja rozmiaru wpływa bezpośrednio na dane. Na przykład, obiekt korzystający z NanoID jest kompaktowy, tak dane można było transferować i przechowywać. Wraz ze wzrostem rozmiaru aplikacji, zmiany te zaczyna być widać. 

2. NanoID jest bezpieczniejszy

Większość generatorów używa mało bezpiecznego Math.random(), ale NanoID korzysta z crypto module oraz Web Crypto API, które są o wiele bezpieczniejsze. 

Co więcej, zamiast skorzystać z random % alphabet, NanoID wykorzystał swój własny algorytm o nazwie uniform do implementacji generatora ID.

3. NanoID: jest szybki i kompaktowy 

NanoID jest o 60% szybszy od UUID. Zamiast 36 znaków, alfabet NanoID ma tylko 21 znaków.
 

0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz-


Co więcej, NanoID obsługuje 14 języków programowania:

C#, C++, Clojure and ClojureScript, Crystal, Dart & Flutter, Deno, Go, Elixir, Haskell, Janet, Java, Nim, Perl, PHP, Python with dictionaries, Ruby , Rust, Swift

4. Kompatybilność

NanoID obsługuje też PouchDB, CouchDB Web Workers, Rollup oraz takie biblioteki jak React i React-Native. Unikalny ID w terminalu można uzyskać korzystając z npx nanoid. Jedynym warunkiem jest posiadanie zainstalowanego NodeJSa. 


NanoID jest również dostępne wewnątrz zestawu narzędzi Redux. Możesz go użyć do innych przypadków użycia, takich jak: 

import { nanoid } from ‘@reduxjs/toolkit’
console.log(nanoid()) //‘dgPXxUz_6fWIQBD8XmiSy’

5. Niestandardowy alfabet

NanoID pozwala również developerom na korzystanie z niestandardowego alfabetu. Możesz zmienić literał albo rozmiar identyfikatora w następujący sposób:  

import { customAlphabet } from 'nanoid';
const nanoid = customAlphabet('ABCDEF1234567890', 12);
model.id = nanoid();


W powyższym przykładzie zdefiniowałem niestandardowy alfabet jako ABCDEF1234567890, a rozmiar ID jako 12. 

6. Brak zewnętrznych zależności 

Ponieważ NanoID nie polega na żadnych zewnętrznych zależnościach, to staje się coraz bardziej stabilny i autonomiczny. 

Jest to niezbędne do długofalowego optymalizowania rozmiaru pakietu i sprawienia, aby był on mniej podatny na błędy, które mogą się pojawić wraz z zależnościami. 

Ograniczenia i na czym się skupić w przyszłości 

Opierając się na wielu opiniach ze StackOverflow, można powiedzieć, że nie ma większych problemów z korzystaniem z NanoID. 

Trudności z czytaniem go przez człowieka jest chyba głównym problemem, jaki wielu developerów widzi w NanoID, ponieważ sprawia to, że debugowanie jest wtedy cięższe. Porównując to jednak do UUID, NanoID jest o wiele krótsze i bardziej czytelne. 

Co więcej, jeśli korzystasz z NanoID jako głównego klucza bazy danych, to mogą pojawić się problemy w sytuacji, w której używa się tej samej kolumny jako indeksu klastrowanego. Dzieje się tak, ponieważ NanoID nie jest sekwencyjny 


Na przyszłość...

NanoID staje się najpopularniejszym unikalnym generatorem identyfikatorów dla JS i większość developerów woli go od UUID.
 


Źródło: https://www.npmjs.com/package/nanoid


Powyższe testy porównawcze pokazują wydajność NanoID w porównaniu do innych generatorów. 

NanoID jest w stanie wygenerować ponad 2,2 miliona unikalnych identyfikatorów na sekundę, korzystając z domyślnego alfabetu i ponad 1,8 milionów, kiedy użytkownik korzysta z niestandardowego alfabetu. 

Sam korzystałem zarówno z UUID oraz NanoID i zdecydowanie bardziej polecam NanoID ze względu na mniejszy rozmiar, bycie przyjaznym dla URL, bezpieczeństwo i prędkość. Polecam więc wykorzystać NanoID w swoich projektach i podzielić się wrażeniami w komentarzach. 

Dziękuję za uwagę :)


Oryginał tekstu w języku angielskim możesz przeczytać tutaj

<p>Loading...</p>