uuid_short()
vytváří bitovou konglomeraci ID serveru, poměrně statickou časovou složku a postupně se zvyšující 24bitové celé číslo. Tyto bity jsou nacpané do 8bajtového celého čísla. Časová složka je založena na době spuštění serveru.
uuid()
vytvoří hex řetězec, který představuje 16bajtový UUID verze1. UUID verze 1 jsou bitovou konglomerací ID serveru, aktuálního časového razítka, několika bajtů, které vstupují do hry, pokud generujete ID při vysoké rychlosti, a několika užitečných bitů.
Odpověď na vaši otázku:dělá uuid_short
poskytují časovou a prostorovou jedinečnost, která konkuruje uuid
? Odpověď je ne. Příkladem je ID serveru v uuid_short
je pouze jeden bajt. Pokud tedy máte 256 nebo více serverů, alespoň několik z nich bude mít stejné ID uzlu, což znamená, že ztratíte prostorovou jedinečnost. Pro srovnání, ID serveru ve verzi 1 UUID je 6 bajtů dlouhé, což účinně snižuje šanci na duplikáty pro všechny kromě největší podnikové serverové farmy :)
Lepší otázka je, zda uuid_short
je dost dobrý. Kolize ID můžete vidět, pokud:
- Vygenerujte více než 16 milionů IDS ze stejného serveru v krátkém čase. ***
- Spouštějte všechny servery se stejným ID serveru přesně ve stejnou dobu a sdílejte mezi nimi data.
- Pohrajte si se systémovými hodinami a poté restartujte server.
Druhý problém se většině lidí zdá nepravděpodobný, ale ten první stojí za to prozkoumat, než se zavážete k vytvoření uuid_short
základ vašich klíčů.
*** Na základě dokumentů mysql pro uuid_short
, zdá se, že byste viděli kolize, pokud byste během provozu jednoho serveru vygenerovali více než 16 milionů ID. Ale to by bylo hloupé. Dokumenty mysql dále říkají, že jste v pořádku, pokud nevygenerujete 16 milionů ID za sekundu. To znamená, že pokud vyčerpáte 16 milionů sekvenčních ID, musí narazit na některé bity v časovém razítku. Toto jsem netestoval.