uuid_short()
tworzy bitową konglomerację identyfikatora serwera, dość statyczny składnik czasu i kolejno rosnącą 24-bitową liczbę całkowitą. Te bity są wstawiane do 8-bajtowej liczby całkowitej. Składnik czasu jest oparty na czasie rozruchu serwera.
uuid()
tworzy ciąg szesnastkowy, który reprezentuje 16-bajtowy UUID wersji 1. Identyfikatory UUID w wersji 1 to bitowa konglomeracja identyfikatora serwera, bieżącego znacznika czasu, kilku bajtów, które wchodzą w grę, jeśli identyfikatory są generowane z hiperprędkością, oraz kilku bitów narzędziowych.
Aby odpowiedzieć na twoje pytanie:czy uuid_short
? zapewniają unikatowość czasu i przestrzeni, która rywalizuje z uuid
? Odpowiedź brzmi nie. Przykładem jest identyfikator serwera w uuid_short
to tylko jeden bajt. Więc jeśli masz 256 lub więcej serwerów, co najmniej kilka z nich będzie miało ten sam identyfikator węzła, co oznacza utratę unikalności miejsca. Dla porównania, identyfikator serwera w UUID w wersji 1 ma długość 6 bajtów, skutecznie zabijając szansę na duplikaty dla wszystkich oprócz największej korporacyjnej farmy serwerów :)
Lepszym pytaniem jest, czy uuid_short
jest wystarczająco dobry. Możesz zobaczyć kolizje identyfikatorów, jeśli:
- Wygeneruj ponad 16 milionów IDS z tego samego serwera w krótkim czasie. ***
- Uruchamiaj serwery rozruchowe o tym samym identyfikatorze serwera dokładnie w tym samym czasie i udostępniaj między nimi dane.
- Pobaw się zegarem systemowym, a następnie zrestartuj serwer.
Drugi problem wydaje się mało prawdopodobny dla większości ludzi, ale pierwszy jest wart zbadania, zanim zdecydujesz się na zrobienie uuid_short
podstawa twoich kluczy.
*** Na podstawie dokumentacji mysql dla uuid_short
, wygląda na to, że zobaczysz kolizje, jeśli wygenerowałeś ponad 16 milionów identyfikatorów w czasie pracy jednego serwera. Ale to byłoby głupie. Dokumentacja mysql mówi, że wszystko w porządku, o ile nie generujesz 16 milionów identyfikatorów na sekundę. Oznacza to, że muszą podbić niektóre bity w znaczniku czasu, jeśli wyczerpiesz 16 milionów sekwencyjnych identyfikatorów. Nie testowałem tego.