No me molestaría con la probabilidad de colisión. Simplemente genere una cadena aleatoria y verifique si existe. Si es así, inténtalo de nuevo y no deberías necesitar hacerlo más de un par de veces a menos que ya tengas una gran cantidad de placas asignadas.
Otra solución para generar una cadena pseudoaleatoria de 8 caracteres de longitud en (My)SQL puro:
SELECT LEFT(UUID(), 8);
Puedes probar lo siguiente (pseudocódigo):
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
Dado que esta publicación ha recibido un nivel de atención inesperado, permítanme destacar Comentario de ADTC :el fragmento de código anterior es bastante tonto y produce dígitos secuenciales.
Para una aleatoriedad un poco menos estúpida, prueba algo como esto:
SELECT LEFT(MD5(RAND()), 8)
Y para una verdadera aleatoriedad (criptográficamente segura), use RANDOM_BYTES()
en lugar de RAND()
(pero luego consideraría mover esta lógica a la capa de aplicación).