
20 Kwi Uuid vs Integer – walka identyfikatorów
Jak często spotkałeś się z tym, że robiłeś zawiłe zabezpieczenia, aby użytkownik nie mógł zgadnąć identyfikatora w urlu? A może pracowałeś z uuidami i miałeś dość porównywania ich w bazie, aby dojść, który rekord jest tym, czego szukasz? Dzisiaj porównam i sprawdzę, co jest lepsze, czyli uuid/guid vs integer.
Czym jest uuid/guid?
Uuid – uniwersally unique identifier – to 128 bitowy ciąg znaków, który może zawierać w sobie, zarówno cyfry i liczby, jak i znaki specjalne. Nazywany także Guidem czyli Global unique identifier. Występuje w kilku wersjach, które różnią się tym, na czym bazuje generator.
Bezpieczeństwo
W tym przypadku zwycięzca nasuwa się naturalnie. Łatwiej jest zgadnąć liczbę naturalną niż trzydziesto sześcio znakowy ciąg znaków składający się z liczb, liter i znaków. Przechowywanie w sesji czy nawet w urlu jest bezpieczniejsze niż wrzucanie w ich miejsce liczb całkowitych. Jednak nie dajmy się zwariować i znajmy umiar, np. w projektach używam uuidów, ale tylko dla znaczących danych, dla rzeczy typu komentarz czy ocena nie nadaje uuidów, bo nie są to dane aż tak poufne, raczej ogólnodostępne i w tym przypadku byłby to po prostu przerost formy nad treścią.
Teoretycznie Uuidy są unikalne i szansa na wygenerowanie takich samych jest znikoma. Jednak mimo wszystko możliwa. W sieci znalazłam przykład podany przez jednego z programistów na swoim blogu, gdzie spotkał się z przypadkiem duplikatu uuida. Znalazł 4 duplikaty w milionowej bazie. Nie jest to mało wbrew pozorom.
In creating very large databases, GUIDs (as generated by MS’s NEWID() function) WILL have collisions, or duplicates. In a previous project where I was building a large Customer ODS (Operational Data Store), I typically found about 4 collisions per million rows. Code has to be developed to handle this. This was in SQL Server 2000. Perhaps SQL Server 2005 has remedied this.
Zmora programisty
Nie ma co oszukiwać. My programiści jesteśmy leniwi, zawsze szukamy drogi na skróty. A to sobie coś zmienimy bezpośrednio w bazie danych, a to, zamiast szukać przyczyny wrzucimy jakiegoś ifka. Zdecydowanie się na uuidy nie jest pójściem na łatwiznę. Debugowanie czasami doprowadza do szewskiej pasji.
Dodatkową wadą uuid jest to, że zajmują więcej miejsca, bo aż 16 bajtów, od identyfikatorów numerycznych, które potrzebują 4 bajty. Za większym rozmiarem idzie także czas procesowania. Wiadomo, że przy kilku czy nawet kilkudziesięciu sztukach nie poczujemy różnicy, ale w momencie, gdy musisz procesować tysiące czy nawet miliony, może nam się uzbierać parę sekund.
Nie taki wilk straszny jak go malują
Uuidy bardzo dobrze sprawdzają się przy małych i średnich, a nawet dużych, ale nie bardzo dużych aplikacjach, ponieważ możemy pokusić się mimo wszystko przy tej skali, że są unikalne. Świetnie sprawdzają się także przy bazach rozproszonych. Także, jeśli przyjdzie nam scalić kilka tabel, przy autoincrementacji mielibyśmy problem, a uuidy radzą sobie świetnie. Nie trzeba bać się uuidów, a nawet warto je polubić, ale korzystaj z nich z głową, nie pakuj na siłę wszędzie, gdzie się da.
Ramsey/uuid
To jeden z najbardziej znanych i najczęściej używanych zewnętrznych bibliotek udostępniający pełną obsługę uuidów. Ja również w projekcie wykorzystuje go do identyfikacji np. wydarzeń. Ramhsey udostępnia 4 wersje uuidów:
- Wersja 1 – bazuje na czasie: e4eaaaf2-d142-11e1-b3e4-080027620cdd.
- Wersja 3 – bazuje na czasie oraz hashu wygenerowanym w MD5: 11a38b9a-b3da-360f-9353-a5a725514269
- Wersja 4 – jest całkowicie losowo generowana: 25769c6c-d34d-4bfe-ba98-e0ee856f3e7a
- Wersja 5 – bazuje na czasie i hashu generowanym w SHA1: c4a760a8-dbcf-5254-a0d9-6a4474bd1b62
Pewnie zauważyłeś, że nie ma wersji 2. Dlaczego to już trzeba pytać autorów.
Instalacja wygląda standardowo. Biblioteka jest dostosowany do wersji najnowszej wersji Symfony
composer require ramsey/uuid
Między wersjami 2 a 3 biblioteki weszło trochę zmian, przede wszystkim strukturalnych dlatego, jeśli masz już istniejący projekt i chcesz podnieść wersje, zwróć uwagę na changelog. Osobiście nie miałam problemów przy podnoszeniu, ale warto przeczytać, co się zmieniło.
Co sądzisz o uuidach? Korzystałeś z nich wcześniej? Daj znać w komentarzu o swoich doświadczeniach.