Nie zawracałbym sobie głowy prawdopodobieństwem kolizji. Po prostu wygeneruj losowy ciąg i sprawdź, czy istnieje. Jeśli tak, spróbuj ponownie i nie powinieneś robić tego więcej niż kilka razy, chyba że masz już przypisaną dużą liczbę tablic.
Inne rozwiązanie do generowania 8-znakowego pseudolosowego ciągu w czystym (My)SQL:
SELECT LEFT(UUID(), 8);
Możesz wypróbować następujące (pseudo-kod):
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
Ponieważ ten post spotkał się z nieoczekiwanym zainteresowaniem, pozwólcie, że wyróżnię Komentarz ADTC :powyższy fragment kodu jest dość głupi i tworzy kolejne cyfry.
Aby uzyskać nieco mniej głupią losowość, spróbuj zamiast tego czegoś takiego:
SELECT LEFT(MD5(RAND()), 8)
Aby uzyskać prawdziwą (bezpieczną kryptograficznie) losowość, użyj RANDOM_BYTES()
zamiast RAND()
(ale wtedy rozważyłbym przeniesienie tej logiki do warstwy aplikacji).