Jeg ville ikke bekymre mig om sandsynligheden for kollision. Bare generer en tilfældig streng og kontroller, om den findes. Hvis det gør det, så prøv igen, og du skulle ikke behøve at gøre det mere end et par gange, medmindre du allerede har tildelt et stort antal plader.
En anden løsning til at generere en 8-tegn lang pseudo-tilfældig streng i ren (Min)SQL:
SELECT LEFT(UUID(), 8);
Du kan prøve følgende (pseudo-kode):
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
Da dette indlæg har fået et uventet niveau af opmærksomhed, lad mig fremhæve ADTCs kommentar :Ovenstående kodestykke er ret dumt og producerer sekventielle cifre.
For lidt mindre dumme tilfældigheder prøv noget som dette i stedet :
SELECT LEFT(MD5(RAND()), 8)
Og for ægte (kryptografisk sikker) tilfældighed, brug RANDOM_BYTES()
i stedet for RAND()
(men så ville jeg overveje at flytte denne logik op til applikationslaget).