156 votes

Génération d'une chaîne de 8 caractères unique et aléatoire à l'aide de MySQL

Je travaille sur un jeu qui implique des véhicules à un moment donné. J'ai une table MySQL nommée "véhicules" contenant les données sur les véhicules, y compris la colonne "plaque" qui stocke les plaques d'immatriculation des véhicules.

Maintenant, voici la partie avec laquelle j'ai des problèmes. Je dois trouver une plaque d'immatriculation inutilisée avant de créer un nouveau véhicule - il doit s'agir d'une chaîne alphanumérique aléatoire de 8 caractères. Pour y parvenir, j'ai utilisé une boucle while en Lua, qui est le langage dans lequel je programme, pour générer des chaînes et interroger la base de données pour voir si elle est utilisée. Cependant, à mesure que le nombre de véhicules augmente, je m'attends à ce que cela devienne encore plus inefficace que maintenant. J'ai donc décidé d'essayer de résoudre ce problème en utilisant une requête MySQL.

La requête dont j'ai besoin doit simplement générer une chaîne alphanumérique de 8 caractères qui n'est pas déjà dans la table. J'ai de nouveau pensé à l'approche de la boucle generate&check, mais je ne limite pas cette question à celle-ci, au cas où il en existerait une plus efficace. J'ai réussi à générer des chaînes de caractères en définissant une chaîne contenant tous les caractères autorisés et en la soustrayant de manière aléatoire, mais rien de plus.

Toute aide est appréciée.

2voto

Lawrence Andrews Points 440

Compte tenu du nombre total de caractères dont vous avez besoin, vous avez très peu de chances de générer deux plaques d'immatriculation exactement similaires. Vous pourriez donc probablement vous en sortir en générant les numéros en LUA.

Vous avez 36^8 plaques d'immatriculation uniques différentes (2 821 109 907 456, c'est beaucoup), même si vous aviez déjà un million de plaques d'immatriculation, vous auriez une très faible chance de générer une plaque que vous avez déjà, environ 0,000035%.

Bien entendu, tout dépend du nombre de plaques d'immatriculation que vous allez créer.

2voto

Mahoor13 Points 943

Cette fonction génère une chaîne aléatoire basée sur la longueur de votre entrée et les caractères autorisés, comme ceci :

SELECT str_rand(8, '23456789abcdefghijkmnpqrstuvwxyz');

code de fonction :

DROP FUNCTION IF EXISTS str_rand;

DELIMITER //

CREATE FUNCTION str_rand(
    u_count INT UNSIGNED,
    v_chars TEXT
)
RETURNS TEXT
NOT DETERMINISTIC
NO SQL
SQL SECURITY INVOKER
COMMENT ''
BEGIN
    DECLARE v_retval TEXT DEFAULT '';
    DECLARE u_pos    INT UNSIGNED;
    DECLARE u        INT UNSIGNED;

    SET u = LENGTH(v_chars);
    WHILE u_count > 0
    DO
      SET u_pos = 1 + FLOOR(RAND() * u);
      SET v_retval = CONCAT(v_retval, MID(v_chars, u_pos, 1));
      SET u_count = u_count - 1;
    END WHILE;

    RETURN v_retval;
END;
//
DELIMITER ;

Ce code est basé sur fonction shuffle string envoie par "Ross Smith II"

2voto

Paul Harris Points 43

Pour créer un échantillon aléatoire alphanumérique à 10 chiffres à l'exception des sosies 01oOlI :

LPAD(LEFT(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(TO_BASE64(UNHEX(MD5(RAND()))), "/", ""), "+", ""), "=", ""), "O", ""), "l", ""), "I", ""), "1", ""), "0", ""), "o", ""), 10), 10, 0)

C'est exactement ce dont j'avais besoin pour créer un code promotionnel . Les caractères prêtant à confusion sont supprimés afin de réduire les erreurs lors de la saisie dans un formulaire de code de bon d'achat.

J'espère que cela aidera quelqu'un, sur la base de La réponse brillante de Jan Uhlig .

Veuillez consulter la réponse de Jan pour connaître le fonctionnement de ce code.

2voto

Antares Points 92

Une solution simple et efficace pour obtenir une chaîne de 10 caractères aléatoires avec des lettres et des chiffres majuscules et minuscules :

select substring(base64_encode(md5(rand())) from 1+rand()*4 for 10);

1voto

τεκ Points 1251

Si vous êtes d'accord avec des plaques d'immatriculation "aléatoires" mais tout à fait prévisibles, vous pouvez utiliser une registre à décalage à rétroaction linéaire pour choisir le numéro de plaque suivant - il est garanti qu'il passe par tous les numéros avant de répéter. Cependant, sans quelques mathématiques complexes, vous ne pourrez pas passer par toutes les chaînes alphanumériques de 8 caractères (vous obtiendrez 2^41 des 36^8 (78%) plaques possibles). Pour mieux remplir cet espace, vous pourriez exclure une lettre des plaques (peut-être O), ce qui vous donnerait 97%.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X