12
votes

générer un identifiant alphanumérique séquentiel à cinq chiffres

Vue d'ensemble générale:

La fonction ci-dessous crache une pièce d'identité aléatoire. J'utilise cela pour fournir un alias de confirmation pour identifier un enregistrement. Cependant, j'ai dû vérifier la collision (quelle que soit peu probable), car nous n'utilisons que cinq chiffres. Avec les caractères autorisés énumérés ci-dessous, il apparaît à environ 33 millions de combinaisons. Finalement, nous obtiendrons à cinq millions de dollars ou plus d'enregistrements afin que la collision devienne un problème.

Le problème:

la vérification des alias de dupe est inefficace et lourde des ressources. Cinq millions d'enregistrements sont beaucoup à chercher. Surtout lorsque cette recherche est effectuée simultanément par différents utilisateurs.

Ma question:

existe-t-il un moyen de «incrémenter automatiquement» les combinaisons autorisées par cette fonction? Ce qui signifie que je n'ai besoin que de rechercher le dernier alias du dossier et de passer à la combinaison suivante?

Limitations acquittées:

Je réalise que le code serait considérablement différent de la fonction ci-dessous. Je me rends également compte que MySQL dispose d'une fonctionnalité d'incrémentation automatique des ID numériques, mais le projet nécessite un alias à cinq chiffres avec les caractères autorisés de '23456789ABCDEFGHJKLNPQRSTUVWXYZ'. Mes mains sont liées sur ce problème.

Ma fonction actuelle: xxx


10 commentaires

+1 pour une question bien structurée :)


Ha, merci pendo. La communauté de sorte est géniale. Il est irrespectueux de gifler une question négligée.


32 ^ 5 = 33 554,432 <50 000 000


On dirait que l'ID n'a pas besoin d'être aléatoire, juste unique. Est-ce exact?


Y a-t-il une raison particulière qu'il doit être aléatoire? Contrairement à 2 , 3 ,. y , z , 22 . . 2Z ...


Créez une table séparée avec les identifiants uniques et marquez ceux qui sont utilisés (c'est comme ça que nous l'avons résolu))


Oui, il doit simplement être unique, mais doit être à cinq chiffres, même pour le premier identifiant émis


@gumbo, tu as raison. Je l'ai changé.


Avec 30 millions de valeurs possibles, la collision deviendrait un problème d'environ 10 000 enregistrements (voir Problème d'anniversaire ) .


TGR, je crois que cela serait vrai si nous avions dit "Quel est le capot probable que deux alias déjà dans la base de données sont les mêmes". Cependant, puisque nous nommons un alias et que nous disons "quelle est la capuche probable que Alias ​​X réside dans la base de données" Le problème d'anniversaire ne s'applique pas. Par exemple, si vous deviez dire "à quel point est-ce probable que deux personnes ont l'anniversaire du 04/01 dans un groupe donné" qui n'est pas la même chose que dire "à quel point c'est probable que deux personnes ont le même anniversaire dans un groupe donné ".


3 Réponses :


5
votes

Pourquoi ne pas simplement créer un index unique sur la colonne Alias?

CREATE UNIQUE INDEX uniq_alias ON MyTable(alias);


1 commentaires

Citer Clay Davis: "shiiiiiiiiiiiiiIIIIIIIIIIIIIIIIIIL". Merci monsieur, je pense que c'est la solution la plus simple. C'est l'effet sur l'épaule pour vous.



0
votes

Vous pouvez rouler votre propre incrément automatique. Il serait probablement assez inefficace, car vous devriez comprendre où dans le processus, votre incrément était. Par exemple, si vous avez attribué la position dans votre chaîne aléatoire sous forme d'entier et démarré avec (0) (0) (0) (0) (0) qui équivaudrait à 22222 comme ID. Ensuite, pour obtenir le prochain, il suffit d'incrémenter la dernière valeur à (0) (0) (0) (0) (0) (1) qui se traduirait en 22223. Si le dernier deviendrait à votre longueur de chaîne, faites-la. La seconde pour durer, etc ... ce n'est pas exactement aléatoire, mais ce serait incrémenté et unique.


0 commentaires

1
votes

Ce que vous avez vraiment besoin de faire est de convertir de la base 10 à la base SHLEN ($ caractères) code>.

php est livré avec une fonction intégrée base_convert code>, mais cela ne fait pas exactement ce que vous voulez, car il utilisera les chiffres zéro, une et la lettre 'O', que vous ne le faites pas avoir dans votre version. Vous aurez donc besoin d'une fonction pour mapper les valeurs de base_convert code> de / à vos valeurs: p> xxx pré>

maintenant que vous avez ce: p >

 public function next_id($last_id)
 {
    $my_characters = '23456789ABCDEFGHJKLMNPQRSTUVWXYZ';
    $std_characters ='0123456789abcdefghijklmnopqrstuv';

    // Map from your basing to the standard basing.
    $mapped = map_basing($last_id, $my_characters, $std_characters);

    // Convert to base 10 integer and increment.
    $intval = base_convert($mapped, strlen($my_characters), 10);
    $intval++;

    // Convert to standard basing, then to our custom basing.
    $newval_std = base_convert($intval, 10, strlen($my_characters));
    $newval = map_basing($newval_std, $std_characters, $my_characters);


    return $newval;
 }


0 commentaires