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 przy­padku zwy­cięzca nasuwa się natu­ral­nie. Łatwiej jest zgad­nąć liczbę natu­ralną niż trzy­dzie­sto sze­ścio zna­kowy ciąg zna­ków skła­da­jący się z liczb, liter i zna­ków. Prze­cho­wy­wa­nie w sesji czy nawet w urlu jest bez­piecz­niej­sze niż wrzu­ca­nie w ich miej­sce liczb cał­ko­wi­tych. Jed­nak nie dajmy się zwa­rio­wać i znajmy umiar, np. w projektach uży­wam uuidów, ale tylko dla zna­czą­cych danych, dla rze­czy typu komen­tarz czy ocena nie nadaje uuidów, bo nie są to dane aż tak poufne, raczej ogól­no­do­stępne i w tym przy­padku byłby to po pro­stu prze­rost formy nad tre­ścią.

Teore­tycz­nie Uuidy są uni­kalne i szansa na wyge­ne­ro­wa­nie takich samych jest zni­koma. Jed­nak mimo wszystko moż­liwa. W sieci zna­la­złam przy­kład podany przez jed­nego z pro­gra­mi­stów na swoim blogu, gdzie spo­tkał się z przy­pad­kiem dupli­katu uuida. Zna­lazł 4 dupli­katy w milio­no­wej bazie. Nie jest to mało wbrew pozo­rom.

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 oszu­ki­wać. My pro­gra­mi­ści jeste­śmy leniwi, zawsze szu­kamy drogi na skróty. A to sobie coś zmie­nimy bez­po­śred­nio w bazie danych, a to, zamiast szu­kać przy­czyny wrzu­cimy jakie­goś ifka. Zde­cy­do­wa­nie się na uuidy nie jest pój­ściem na łatwi­znę. Debu­go­wa­nie cza­sami dopro­wa­dza do szew­skiej pasji.

Dodat­kową wadą uuid jest to, że zaj­mują wię­cej miej­sca, bo aż 16 baj­tów, od iden­ty­fi­ka­to­rów nume­rycz­nych, które potrze­bują 4 bajty. Za więk­szym roz­mia­rem idzie także czas pro­ce­so­wa­nia. Wia­domo, że przy kilku czy nawet kil­ku­dzie­się­ciu sztu­kach nie poczu­jemy róż­nicy, ale w momen­cie, gdy musisz pro­ce­so­wać tysiące czy nawet miliony, może nam się uzbie­rać 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.

Podobne posty

Jestem programistką, która lubi mieć ręce pełne roboty. Do życia potrzebuje komputera z internetem i kubka gorącej kawy. Więcej na stronie o mnie.

Comments

ZOSTAW ODPOWIEDŹ

Please enter your comment!
Please enter your name here