IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[Tableaux] Générer un nombre aléatoire et unique possible ? [Fait]


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 30
    Points : 32
    Points
    32
    Par défaut [Tableaux] Générer un nombre aléatoire et unique possible ?
    Après plusieurs lecture, je n'ai trouvé aucune solution vraiment idéale.Existe t-elle ?
    Je m'explique :
    je souhaite avoir un numéro de client dans ma base mais qui soit généré de manière aléatoire. Je n'utiliserai donc pas l'id client qui est en auto-increment dans ma table mais bien un numéro de client.

    Une idée sur l'algo ou un bout de script ?

    Merci

  2. #2
    Inactif  
    Avatar de Kerod
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    11 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 11 672
    Points : 20 778
    Points
    20 778
    Par défaut
    Il existe des bdd qui permettent de le faire de manière aléatoire...

    Mais sinon tu peux faire une boucle for avec un rand.
    Dans ta boucle tu détermine le nombre de chiffres que tu veux tu concatènes le tout

    ou carrément un rand(1, valmax)

    Mais si tu veux un id unique, il faudra tester avant d'insérer dans la bdd

  3. #3
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut
    Y'a une fonction comme ça qui se base sur la date (donc unique)... euh dommage j'ai plus son nom

  4. #4
    Membre éclairé Avatar de Hervé Saladin
    Homme Profil pro
    Ingénieur d'études en développement et déploiement d'applications
    Inscrit en
    Décembre 2004
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur d'études en développement et déploiement d'applications
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2004
    Messages : 647
    Points : 799
    Points
    799
    Par défaut
    et pourquoi pas une solution hybride de ces deux propositions ?
    tu concatene un pseudo-aléatoire généré par rand() avec un timestamp ... non ?

  5. #5
    Nouveau membre du Club

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 30
    Points : 32
    Points
    32
    Par défaut
    J'avais pensé à concaténer un timestamp et un chiffre via la fonction rand.

    Ce id unique et aléatoire est crée via un formulaire, ça n'est pas possible que dans le même millième de seconde, un id soit crée ?
    Si 2 personnes valident le formulaire exactement en même temps ?

    Ex d'algo mais qui ne marcherait pas à priori :
    1. création du chiffre aléatoire
    2. Test de l'existence de ce chiffre par rapport à la base de données
    3. Dans ma boucle, si ce nombre aléatoire existe déjà, je crée un nouveau chiffre.

    Le problème c'est que la création du chiffre est faite de nouveau de manière aléatoire et que je ne peux pas le retester.(il faudrait que je relance la boucle)

    Des idées ?

  6. #6
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    Salut,

    Ce id unique et aléatoire est crée via un formulaire, ça n'est pas possible que dans le même millième de seconde, un id soit crée ?
    On ne sait jamais !

    Ex d'algo mais qui ne marcherait pas à priori :
    1. création du chiffre aléatoire
    2. Test de l'existence de ce chiffre par rapport à la base de données
    3. Dans ma boucle, si ce nombre aléatoire existe déjà, je crée un nouveau chiffre.

    Le problème c'est que la création du chiffre est faite de nouveau de manière aléatoire et que je ne peux pas le retester.(il faudrait que je relance la boucle)

    Des idées ?

    Pourquoi cela ne fonctionnerait pas ?

    vite fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
     
    function CreeId(){} // renvoie un id *peut etre* unique
     
    function VerifieUnicite($IdUnique){} // Interroge la bdd pour savoir si cet id est unique
     
    function CreeIdUnique()
    {
        $IdUnique = "";
     
        do
        {
            $IdUnique = CreeId();
        }
        while(VerifieUnicite($IdUnique) == false);
     
        return $IdUnique;
    }
    Le mieux étant une concaténation de l'id auto increment unique avec un nombre au pif, ou même pourquoi pas une partie de la session.
    Avec une telle méthode tu n'as même pas besoin de tester si le code client existe déja, car la bdd s'en occupe pour toi !

    bbye

  7. #7
    Membre éclairé Avatar de Hervé Saladin
    Homme Profil pro
    Ingénieur d'études en développement et déploiement d'applications
    Inscrit en
    Décembre 2004
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur d'études en développement et déploiement d'applications
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2004
    Messages : 647
    Points : 799
    Points
    799
    Par défaut
    Citation Envoyé par arnoweb
    Si 2 personnes valident le formulaire exactement en même temps ?
    Dans ce cas, il faudrait aussi que par manque de bol, le nombre aléatoire généré soit le même pour les deux (très peu probable si le nombre est generé dans un grand intervalle).
    Si ça arrivait quand même, une des deux insertions serait refusée par le serveur de données, donc l'un des deux utilisateurs obtiendrait un message d'erreur, mais cela n'insererait pas deux lignes avec le même id puisque la BD gère ça très bien.
    Donc, au final, il y aurait une chance sur je sais pas combien de millions (pour pas dire de milliards) pour qu'un utilisateur ait un message d'erreur et qu'il doive recommencer son insertion ... ça me paraît pas dramatique.
    Au pire tu peux aussi concatener l'IP de l'user, ou son id de session (deux utilisateurs ne peuvent pas avoir le meme id session en meme temps)

  8. #8
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut
    La session_id() est-elle unique?
    Si oui pas la peine de chercher trop loin

  9. #9
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    Oui et non. Un SID n'à besoin de n'être unique que par rapport aux autres sessions existantes lors de la création. Ce qui n'empeche pas d'avoir des SID identiques sur le long terme.

  10. #10
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut
    Citation Envoyé par ePoX
    Oui et non. Un SID n'à besoin de n'être unique que par rapport aux autres sessions existantes lors de la création. Ce qui n'empeche pas d'avoir des SID identiques sur le long terme.
    Donc c'est ça la solution pour éviter les insertions identiques: tu récupères le session_id() et tu le concatènes à une valeur générée par timestamp.

  11. #11
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    Le mieux étant une concaténation de l'id auto increment unique avec un nombre au pif............Avec une telle méthode tu n'as même pas besoin de tester si le code client existe déja, car la bdd s'en occupe pour toi !
    Je préfére encore cette méthode qui mets en avant et assure l'intégrité de la bdd.

  12. #12
    Invité
    Invité(e)
    Par défaut Pourquoi réinventer la roue ?
    Pourquoi ne pas utiliser la fonction PHP uniqid

    Citation Envoyé par Manuel PHP
    uniqid
    (PHP 3, PHP 4, PHP 5)

    uniqid -- Génère un identifiant unique
    Description
    string uniqid ( [string prefix [, bool more_entropy]] )


    uniqid() retourne un identifiant préfixé unique, basé sur l'heure courante, en micro-secondes. Le paramètre prefix est optionnel mais peut servir à identifier facilement différents hôtes, si vous générez simultanément des fichiers depuis plusieurs hôtes, à la même micro-seconde. Depuis PHP 4.3.1, prefix peut prendre jusqu'à 114 caractères.

    Si le paramètre optionnel more_entropy est TRUE, uniqid() ajoutera une entropie "combined LCG" à la fin de la valeur retournée, ce qui renforcera encore l'unicité de l'identifiant.

    Sans prefix (préfixe vide), la chaîne retournée fera 13 caractères. Si more_entropy est à TRUE, elle fera 23 caractères.

  13. #13
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut
    Voiiiiiiiiillaaaaaaaaaaaaaa la fonction que j'avais perdue !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Algo pour générer des nombres aléatoires
    Par Admin dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 12/06/2006, 09h06
  2. Réponses: 2
    Dernier message: 16/05/2006, 17h02
  3. Réponses: 16
    Dernier message: 08/03/2006, 11h18
  4. générer un nombre aléatoire gaussien
    Par kayari dans le forum Probabilités
    Réponses: 9
    Dernier message: 24/05/2005, 23h57
  5. Générer un nombre aléatoire entre 0 et 1 (INCLUS !!!)
    Par haypo dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 22/08/2002, 16h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo