Non mi preoccuperei della probabilità di collisione. Basta generare una stringa casuale e verificare se esiste. In tal caso, riprova e non dovresti aver bisogno di farlo più di un paio di volte a meno che tu non abbia già assegnato un numero enorme di targhe.
Un'altra soluzione per generare una stringa pseudocasuale lunga 8 caratteri in puro (My)SQL:
SELECT LEFT(UUID(), 8);
Puoi provare quanto segue (pseudo-codice):
DO
SELECT LEFT(UUID(), 8) INTO @plate;
INSERT INTO plates (@plate);
WHILE there_is_a_unique_constraint_violation
-- @plate is your newly assigned plate number
Poiché questo post ha ricevuto un livello di attenzione inaspettato, consentitemi di evidenziare Commento di ADTC :il codice sopra è piuttosto stupido e produce cifre sequenziali.
Per una casualità leggermente meno stupida, prova invece qualcosa del genere:
SELECT LEFT(MD5(RAND()), 8)
E per una vera casualità (crittograficamente sicura), usa RANDOM_BYTES()
anziché RAND()
(ma poi prenderei in considerazione di spostare questa logica fino al livello dell'applicazione).