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

Framework .NET Discussion :

Faire un Id public a 6 chiffre aléatoire et unique


Sujet :

Framework .NET

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 69
    Points : 82
    Points
    82
    Par défaut Faire un Id public a 6 chiffre aléatoire et unique
    Bonjour,
    Je suis entrain de mettre en place un system de souscription en ligne, pour chaque souscription un identifiant et un mot de passe son donné au client.
    Le problème c'est que mes identifiant sont pas très sécurisé et pas très esthetique puisqu'il reprenne les id de la basse de donné.

    Par example un couple id/password peut ressemblé a cela:

    ID : 120 (la 120 em souscription)
    Password: md3pzf

    Je voudrai pouvoir générer un ID a 6 chiffre qui soit unique dans ma base de donné, aléatoire, et réussir a ne pas tomber sur le même id aléatoire 2 foi de suite ...

    Est ce que vous aurriez des conseilles sur comment faire une tel chose sans que ce soit trop l'uzine a gaz.
    On ma conseiller de généré a l'aide d'une librairie les 1 millard de possibilité d'un coup et de les utiliser par la suite. Mais cela risque de faire exploser ma base de donné, et c'est pas très pratique.

    Merci et a bientot.

  2. #2
    Membre expérimenté Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Points : 1 539
    Points
    1 539
    Par défaut
    6 chiffres, t'as que 1 million de possibilités... Ca fait que 4mo...
    T'exploses rien du tout avec ça.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 69
    Points : 82
    Points
    82
    Par défaut
    Voila le code que j'ai pompé sur internet,
    je vais essayé de le mettre en mode base de donné alors.

    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
    19
     
    Random rand = new Random();
           List<int> RemainNums;
     
           private void CreateRandomNumbers()
           {
               RemainNums = new List<int>();
               RemainNums.AddRange( new int[] { 1, 2, 3, 4, 5, 6, 7,
                   8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
                   22, 23, 24, 25, 26, 27, 28, 29, 30 } );
               ... // the regular code here
           }
     
           // This method creates a random number.
           private void NewRandomNumber()
           {
               int index = rand.Next( 0, RemainNums.Count - 1 );
               ARandomNumber = RemainNums[index];
               RemainNums.RemoveAt( index );
    http://social.msdn.microsoft.com/for...-18c31620199a/

  4. #4
    Membre régulier
    Profil pro
    profiler
    Inscrit en
    Février 2008
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : profiler

    Informations forums :
    Inscription : Février 2008
    Messages : 84
    Points : 99
    Points
    99
    Par défaut
    En utilisant les GUID ?

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 69
    Points : 82
    Points
    82
    Par défaut
    Voici le code :

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     Parallel.Invoke(new ParallelOptions(), () =>
                                {
                                    IDataContext dataContext = new DataContext();
                                    for (int i = 100000; i < 200000; i++)
                                    {
                                        dataContext.IdPublic.Add(new IdPublic() { Value = i });
                                        Console.WriteLine(i);
                                        dataContext.Save();
                                    }
                                },  // close first Action
     
                                () =>
                                {
                                    IDataContext dataContext = new DataContext();
                                    for (int i = 200000; i < 300000; i++)
                                    {
                                        dataContext.IdPublic.Add(new IdPublic() { Value = i });
                                        Console.WriteLine(i);
                                        dataContext.Save();
                                    }
                                },  // close first Action
     
                                () =>
                                {
                                    IDataContext dataContext = new DataContext();
                                    for (int i = 300000; i < 400000; i++)
                                    {
                                        dataContext.IdPublic.Add(new IdPublic() { Value = i });
                                        Console.WriteLine(i);
                                        dataContext.Save();
                                    }
                                }
                            );
     
       public int getRandomId()
            {
                try
                {
                    IDataContext dataContext = new DataContext();
                    Random random = new Random();
                    int index = random.Next(0, dataContext.IdPublic.Count() - 1);
                    IdPublic IdPublic = dataContext.IdPublic.Remove(dataContext.IdPublic.OrderBy(id => id.IdPublicID).Skip(index).Take(1).First());
                    dataContext.Save();
                    return IdPublic.Value;
                }
                catch (Exception)
                {
                    throw new Exception("Une erreur avec le random ID c'est produit, il faut peut être regénéré des ids, ou l'index est peut être out of range");
                }
            }

  6. #6
    Membre chevronné Avatar de Er3van
    Homme Profil pro
    Architecte Logiciel
    Inscrit en
    Avril 2008
    Messages
    1 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte Logiciel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 430
    Points : 2 227
    Points
    2 227
    Par défaut
    Comme dit plus haut, utilise des GUID. Ca répond à ton besoin, et c'est simple d'utilisation.

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    GUID monIDUnique = System.GUID.NewGUID() ;
    One minute was enough, Tyler said, a person had to work hard for it, but a minute of perfection was worth the effort. A moment was the most you could ever expect from perfection.

    -- Chuck Palahniuk, Fight Club, Chapter 3 --

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 69
    Points : 82
    Points
    82
    Par défaut
    Oui mais le truc c'est que je vais pas demander a un client de rentrer 15 chiffre pour s'authentifier ...
    Mais sinon c'est sur que les guid sont ce qu'il faut mais je croi qu'il n'existe pas de guid a 6 chiffre.

  8. #8
    Membre chevronné Avatar de Er3van
    Homme Profil pro
    Architecte Logiciel
    Inscrit en
    Avril 2008
    Messages
    1 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte Logiciel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 430
    Points : 2 227
    Points
    2 227
    Par défaut
    GUID c'est unique.... au monde, donc forcément sur 6 chiffres ça n'est pas possible.

    En relisant le premier message, je constate que tu veux un password et non un id technique...

    ... mais dans ce cas, pourquoi as-tu besoin de l'unicité ?

    Si c'est généré en aléatoire, ça sera très souvent unique, mais pas garanti.
    Si ton user est amené à changer le mot de passe d’emblée, ça ne devrait pas poser de problème.
    One minute was enough, Tyler said, a person had to work hard for it, but a minute of perfection was worth the effort. A moment was the most you could ever expect from perfection.

    -- Chuck Palahniuk, Fight Club, Chapter 3 --

  9. #9
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Je ne comprends pas bien ton problème : qu'est ce qui t'empêche justement d'utiliser ton id de base, en faisant démarrer la séquence à 100001 par exemple ? (j'ignore quel DBMS tu utilises, mais Oracle et Sql Server supportent ça très bien).

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  10. #10
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    Citation Envoyé par Bluedeep Voir le message
    Je ne comprends pas bien ton problème : qu'est ce qui t'empêche justement d'utiliser ton id de base, en faisant démarrer la séquence à 100001 par exemple ? (j'ignore quel DBMS tu utilises, mais Oracle et Sql Server supportent ça très bien).
    C'est une problématique de sécurité que j'ai déjà rencontré en e-commerce.
    L'identifiant de transaction d'une commande (qui est finalement un identifiant fonctionnel) devait être différent de l'identifiant de la ligne en BDD (qui lui est purement technique). Il devait être unique (logique), assez long (pour l'unicité) et non croissant (pour empecher de prédire le prochain numéro de transaction).

  11. #11
    Membre éprouvé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2011
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2011
    Messages : 487
    Points : 945
    Points
    945
    Par défaut
    GUID c'est unique.... au monde, donc forcément sur 6 chiffres ça n'est pas possible.
    [Mauvaise langue]Même s'il a un taux de collision totalement risible, un GUID reste codé sur 2^128 et peut donc potentiellement être en double[/Mauvaise langue]

    Pour en revenir au vrai problème, il y a évidemment plusieurs solutions de faire, notamment celles proposées juste avant.

    Si tu tiens à faire le système à ta manière, tu peux générer ton id d'une manière complètement bidon et le stocker dans un champ en base. Pour l'unicité ça implique de faire une requête sur toutes les lignes de ta table :

    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
    19
     
    // Dans ton objet qui crée les ID
    public int CreateTransactionID()
    {
        string transactionID = string.Empty;
     
        while(transactionID.Length != 6)
        {
            transactionID += random.NextInt(10).ToString();
        }
     
        return int.Parse(transactionID);
    }
     
    //Dans ta DAL
    public bool IsIDUnique(int id)
    {
        return this._context.transaction.Where(t => tra_id == id).Count() > 0;
    }
    Et dans ton code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    bool IsIDUnique = true;
     
    while(!IsIDUnique)
    {
        id = this.CreateTransactionID();
     
        if(!monObjetDAL.IsIDUnique(id))
            IsIDUnique = false;
    }
     
    // La tu as ton ID Unique et tu peux l'insérer en base
    C'est un peu bourrin mais c'est ce que tu cherches à faire je crois
    Mon blog sur les technos .NET et Agile -> http://blog.developpez.com/maximepalmisano/

  12. #12
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par Nathanael Marchand Voir le message
    C'est une problématique de sécurité que j'ai déjà rencontré en e-commerce.
    L'identifiant de transaction d'une commande (qui est finalement un identifiant fonctionnel) devait être différent de l'identifiant de la ligne en BDD (qui lui est purement technique). Il devait être unique (logique), assez long (pour l'unicité) et non croissant (pour empecher de prédire le prochain numéro de transaction).
    Ok, et cet identifiant doit être user friendly, je suppose ? (sinon le GUID convient très bien).

    Je ne vois pas trop d'autres solution qu'un tirage alétoire dans la liste compléte (ici de 100001 à 999999 par exemple et flagage associé), test si existe, retirage le cas échéant avec une liste en cache et persistée à chaque nouvelle valeur.

    Ou encore, trouver un algo "style hash" capable de transformer le nolbre de ticks en valeur à 6 chiffres (mais avec un test/persistance, si il n'y a pas preuve d'unicité).

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  13. #13
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par MaximePalmisano Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    
     transactionID += random.NextInt(10).ToString();
    
    .....
        return this._context.transaction.Where(t => tra_id == id).Count() > 0;
    Deux légères erreurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            
    
     transactionID += random.Next(10).ToString();
    
    .....
        return this._context.transaction.Where(t => tra_id == id).Count() == 0;
    Accessoirement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    string transactionID = string.Empty;
     
        while(transactionID.Length != 6)
        {
            transactionID += random.Next(10).ToString();
        }
    peut être avantageusement remplacé par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     int transactionID = random.Next(100000, 1000000);

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  14. #14
    Membre éprouvé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2011
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2011
    Messages : 487
    Points : 945
    Points
    945
    Par défaut
    peut être avantageusement remplacé par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     int transactionID += random.Next(100000, 1000000);
    Oui et non, chaque méthode a ses avantages et ses désavantages. Il peut très bien mettre le 6 dans une constante qu'il appellera ID_SIZE et si demain il décide de faire des ID à 8 chiffres, il a pas besoin de modifier tout son code. En plus, au bout d'une dizaine de chiffres, le 100000000000 va devenir illisible

    L'avantage de la boucle, c'est aussi que du jour au lendemain, il peut se servir de son random pour réaliser une chaine de caractères alphanumérique en piochant dans un tableau sans avoir à péter tout son code
    Mon blog sur les technos .NET et Agile -> http://blog.developpez.com/maximepalmisano/

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 11/12/2007, 01h05
  2. Générer un chiffre aléatoire
    Par Invité dans le forum Langage
    Réponses: 18
    Dernier message: 11/10/2007, 18h58
  3. nombre à 8 chiffres aléatoires
    Par forzaxelah dans le forum Delphi
    Réponses: 8
    Dernier message: 09/06/2006, 11h30
  4. Choisir un chiffre aléatoire parmi une liste
    Par djsbens dans le forum Général Java
    Réponses: 2
    Dernier message: 08/03/2006, 18h19
  5. Chiffre aléatoire
    Par shamanlinks dans le forum Assembleur
    Réponses: 8
    Dernier message: 14/12/2005, 00h50

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