uuid_short()
producerar en bitvis konglomerat av server-ID:t, en ganska statisk tidskomponent och ett sekventiellt ökande 24-bitars heltal. Dessa bitar är fyllda i ett heltal på 8 byte. Tidskomponenten baseras på serverns uppstartstid.
uuid()
producerar hexadecimal sträng som representerar en 16 byte version1 UUID. Version 1 UUID är en bitvis konglomerat av server-ID:t, den aktuella tidsstämpeln, några byte som kommer in i bilden om du genererar ID:n i hög hastighet, och några verktygsbitar.
För att svara på din fråga:gör uuid_short
ger tid och rum unikhet som konkurrerar med uuid
? Svaret är nej. Exempelvis server-ID:t i en uuid_short
är bara en byte. Så om du har 256 eller fler servrar, kommer åtminstone några av dem att ha samma nod-id, vilket innebär att du förlorar utrymmesunikitet. Som jämförelse är server-ID:t i version 1 UUID 6 byte långt, vilket effektivt dödar risken för dubbletter för alla utom de största företagens serverfarmar :)
En bättre fråga är om uuid_short
är tillräckligt bra. Du kan se ID-kollisioner om du:
- Generera mer än 16 miljoner IDS från samma server på kort tid. ***
- Starta servrar med samma server-ID alla på exakt samma gång och dela data mellan dem.
- Pippla med systemklockan och starta sedan om servern.
Det andra problemet verkar osannolikt för de flesta, men det första är värt att undersöka innan du bestämmer dig för att göra uuid_short
grunden för dina nycklar.
*** Baserat på mysql-dokumenten för uuid_short
, det verkar som om du skulle se kollisioner om du genererade mer än 16 miljoner ID:n under drifttiden för en enda server. Men det vore dumt. Mysql-dokumenten fortsätter med att säga att du mår bra så länge du inte genererar 16 miljoner ID:n per sekund. Det innebär att de måste stöta några av bitarna i tidsstämpeln om du tar slut på de 16 miljoner sekventiella ID:n. Jag har inte testat detta.