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

Algorithmes et structures de données Discussion :

Identifiant unique avec préfixe


Sujet :

Algorithmes et structures de données

  1. #1
    Membre régulier
    Homme Profil pro
    Symfony - CMS Wordpress - Zend
    Inscrit en
    Septembre 2011
    Messages
    306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Symfony - CMS Wordpress - Zend
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2011
    Messages : 306
    Points : 101
    Points
    101
    Par défaut Identifiant unique avec préfixe
    Bonjour,

    Je débute sur un projet
    Et de doit créé une base de données
    L'objectif de mon poste est le suivant
    J'ai besoin de générer un identifiant unique
    Dans une base données ce n'est pas un soucI
    Avec un id auto incrémenté mais comment personnaliser c'est identifiant unique
    De façon à ne pas par la suite tomber sur un identifiant identique ?
    J'aurais besoin d'un préfixe et ensuite une suite de nombre unique

    Merci

  2. #2
    Membre averti
    Homme Profil pro
    Autres
    Inscrit en
    Mai 2017
    Messages
    279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Autres

    Informations forums :
    Inscription : Mai 2017
    Messages : 279
    Points : 421
    Points
    421
    Par défaut
    Un exemple serait plus pratique.
    L’appétit vient en mangeant.
    Pourquoi compliquer quand on peut faire plus simple?
    Une réponse vous a été utile? pensez à
    Vous avez eu la réponse à votre question? marquez votre discussion
    Faites un tour aux FAQs et aux tutoriels et cours.

  3. #3
    Membre expérimenté

    Homme Profil pro
    linux, pascal, HTML
    Inscrit en
    Mars 2002
    Messages
    649
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : linux, pascal, HTML
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2002
    Messages : 649
    Points : 1 493
    Points
    1 493
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    Méthode un peu bateau, rajoute un champ dans le quel tu prend le champ auto-incrémenté concaténé avec un préfixe.

  4. #4
    Membre régulier
    Homme Profil pro
    Symfony - CMS Wordpress - Zend
    Inscrit en
    Septembre 2011
    Messages
    306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Symfony - CMS Wordpress - Zend
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2011
    Messages : 306
    Points : 101
    Points
    101
    Par défaut Exemple de prefixe et d'id
    Merci pour vos réactions.

    Réponse a la requête de Nazoïde

    voici un exemple d'Id: (genre de UUID en fait)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    E2C56DB5-DFFB-48D2-B060-D0F5A71096E0
    c'est l'id finale qui doit etre dans ma base de données.
    Si je doit créer un id ce sera ni plus ni moins que cette taille..

    merci

  5. #5
    Membre averti
    Homme Profil pro
    Autres
    Inscrit en
    Mai 2017
    Messages
    279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Autres

    Informations forums :
    Inscription : Mai 2017
    Messages : 279
    Points : 421
    Points
    421
    Par défaut
    Voici une fonction qui pourra t'aider. A toi de la personnaliser
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    function uuid($length)
    {
        // allowed characters
        $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        // make sure we have enough length
        while (strlen($chars) < $length) {
            $chars .= $chars;
        }
        return substr(str_shuffle($chars), 0, $length);
    }
     
    // Prefix you need
    echo 'prefix'. uuid(25);
    L’appétit vient en mangeant.
    Pourquoi compliquer quand on peut faire plus simple?
    Une réponse vous a été utile? pensez à
    Vous avez eu la réponse à votre question? marquez votre discussion
    Faites un tour aux FAQs et aux tutoriels et cours.

  6. #6
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 416
    Points : 5 814
    Points
    5 814
    Par défaut
    salut

    par définition un champs auto-incrémenté est unique
    maintenant si tu as peur de retrouver un identifiant il te suffit de vérifier son existence ou non dans la base et incrémenter ta variable jusqu’à trouver un nombre disponible
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  7. #7
    Membre averti
    Homme Profil pro
    Autres
    Inscrit en
    Mai 2017
    Messages
    279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Autres

    Informations forums :
    Inscription : Mai 2017
    Messages : 279
    Points : 421
    Points
    421
    Par défaut
    Le problème si je ne me trompe pas est qu'il veut un identifiant UUID.
    Avec la fonction que j'ai proposée, il génère le cod l'identifiant UUID souhaité, il cherche son existence dans la Base de Données. S'il existe, il génère un autre, sinon, il l'insère. son id étant cette fois une chaine de caractère.
    L’appétit vient en mangeant.
    Pourquoi compliquer quand on peut faire plus simple?
    Une réponse vous a été utile? pensez à
    Vous avez eu la réponse à votre question? marquez votre discussion
    Faites un tour aux FAQs et aux tutoriels et cours.

  8. #8
    Membre régulier
    Homme Profil pro
    Symfony - CMS Wordpress - Zend
    Inscrit en
    Septembre 2011
    Messages
    306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Symfony - CMS Wordpress - Zend
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2011
    Messages : 306
    Points : 101
    Points
    101
    Par défaut Explication de l'exemple
    Merci pour ta reponse Nazoïde..

    si j'ai bien compris cette fonction

    vas prendre la chaine de caractère en socle et generé a partir de celle-ci un random de cette meme chaine ?

    ce qui permet d'avoir un grand nombre de possiblité sans avoir de doublon par la suite

    et quand on appel la fonction on rajoute le prefixe?

    il n'est necessaire de pouvoir controllé si effectivement l'UUID est unique

    comment en est-on sur? (en base de données)

    UPDATE : J'ai lu precedent message qui se sont chevauché. je suis d'accord..
    Mon objectif est pouvoir comparer cette UUID avec des appareils Bluetooth ducoup un id auto-incrementé n'identifie pas ce dispostif
    et par la même occasion je me suis dit pourquoi en faire sont identifiant unique dans cette même base de données au lieu de créer deux champs ce qui serait inutile..

    merci

  9. #9
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 416
    Points : 5 814
    Points
    5 814
    Par défaut
    salut

    elle ne pourras jamais te certifier a 100%

    pour cela il faut te référer au GUID
    c'est un mixte entre des nombres aléatoire et la date

    la date permettant l’incrément de ton GUID

    il te faut un champs par exemple pour l'heure minute seconde,..
    un champs pour la date
    et ensuite 8 octet choisie aléatoirement entre 0 et 255 tu auras très peu de chance de retrouver le même GUID du fait d’utiliser la date qui est un incrément naturel
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  10. #10
    Membre averti
    Homme Profil pro
    Autres
    Inscrit en
    Mai 2017
    Messages
    279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Autres

    Informations forums :
    Inscription : Mai 2017
    Messages : 279
    Points : 421
    Points
    421
    Par défaut
    Citation Envoyé par anapurna Voir le message
    Pour générer un identifiant unique avec PHP, on a uniqid() http://php.net/manual/fr/function.uniqid.php. Très bien. Mais en réalité on ne peut pas fixer le nombre de caractères. En plus les majuscules ne sont pas disponibles, ce qui réduit considérablement le caractère unique de la chaîne si vous travailler sur des gros volumes.
    Comme je l'ai si bien dit, sur les projets dont les chaines sont volumineuses, il revient au développeur de contrôler la taille de son id et/ou de le préfixer, ce qui est limité avec uniqid().
    L’appétit vient en mangeant.
    Pourquoi compliquer quand on peut faire plus simple?
    Une réponse vous a été utile? pensez à
    Vous avez eu la réponse à votre question? marquez votre discussion
    Faites un tour aux FAQs et aux tutoriels et cours.

  11. #11
    Membre régulier
    Homme Profil pro
    Symfony - CMS Wordpress - Zend
    Inscrit en
    Septembre 2011
    Messages
    306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Symfony - CMS Wordpress - Zend
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2011
    Messages : 306
    Points : 101
    Points
    101
    Par défaut Generator GUID
    Merci pour ta reponse anapurna..

    j'avoue je n'ai pas penser à çà.. ce qui n'est pas bête

    car ma base de donnée doit resté pérênne au cas ou je ne veux pas effectué des modifs après 1000 UUID ou plus

    j'ai trouver cette fonction:
    est-ce que cà fera l'affaire?
    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
     
    function generateGuid($include_braces = false) {
        if (function_exists('com_create_guid')) {
            if ($include_braces === true) {
                return com_create_guid();
            } else {
                return substr(com_create_guid(), 1, 36);
            }
        } else {
            mt_srand((double) microtime() * 10000);
            $charid = strtoupper(md5(uniqid(rand(), true)));
     
            $guid = substr($charid,  0, 8) . '-' .
                    substr($charid,  8, 4) . '-' .
                    substr($charid, 12, 4) . '-' .
                    substr($charid, 16, 4) . '-' .
                    substr($charid, 20, 12);
     
            if ($include_braces) {
                $guid = '{' . $guid . '}';
            }
     
            return $guid;
        }
    }
    si j'ai compris la sortie doit être sur 8 octets?

    8 octets c'est la taille minimum de la sortie de la fonction? je peux augmenter la taille si je le désire..

  12. #12
    Membre averti
    Homme Profil pro
    Autres
    Inscrit en
    Mai 2017
    Messages
    279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Autres

    Informations forums :
    Inscription : Mai 2017
    Messages : 279
    Points : 421
    Points
    421
    Par défaut
    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
    <?php
    function uuid($length)
    {
        // allowed characters
        $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        // make sure we have enough length
        while (strlen($chars) < $length) {
            $chars .= $chars;
        }
        return substr(str_shuffle($chars), 0, $length);
    }
     
    // Prefix you need
    //$identifiant with this structure E2C56DB5-DFFB-48D2-B060-D0F5A71096E0
    $identifiant = uuid(8).'-'.uuid(4).'-'.uuid(4).'-'.uuid(12);
    echo $identifiant;
    //echo 'prefix'. uuid(25);
     
    //E2C56DB5-DFFB-48D2-B060-D0F5A71096E0
    Pour plus de controle, tu peux remplacer $chars par une REGEX
    L’appétit vient en mangeant.
    Pourquoi compliquer quand on peut faire plus simple?
    Une réponse vous a été utile? pensez à
    Vous avez eu la réponse à votre question? marquez votre discussion
    Faites un tour aux FAQs et aux tutoriels et cours.

  13. #13
    Membre régulier
    Homme Profil pro
    Symfony - CMS Wordpress - Zend
    Inscrit en
    Septembre 2011
    Messages
    306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Symfony - CMS Wordpress - Zend
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2011
    Messages : 306
    Points : 101
    Points
    101
    Par défaut datetime?
    Merci Nazoïde,

    tu ne prend pas en compte la variable de temps dans ton algo pourquoi?

  14. #14
    Membre averti
    Homme Profil pro
    Autres
    Inscrit en
    Mai 2017
    Messages
    279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Autres

    Informations forums :
    Inscription : Mai 2017
    Messages : 279
    Points : 421
    Points
    421
    Par défaut
    Pour générer un identifiant unique avec PHP, on a uniqid() http://php.net/manual/fr/function.uniqid.php. Très bien. Mais en réalité on ne peut pas fixer le nombre de caractères. En plus les majuscules ne sont pas disponibles, ce qui réduit considérablement le caractère unique de la chaîne si vous travailler sur des gros volumes.
    Comme je l'ai si bien dit, sur les projets dont les chaines sont volumineuses, il revient au développeur de contrôler la taille de son id et/ou de le préfixer, ce qui est limité avec uniqid().
    L’appétit vient en mangeant.
    Pourquoi compliquer quand on peut faire plus simple?
    Une réponse vous a été utile? pensez à
    Vous avez eu la réponse à votre question? marquez votre discussion
    Faites un tour aux FAQs et aux tutoriels et cours.

  15. #15
    Membre régulier
    Homme Profil pro
    Symfony - CMS Wordpress - Zend
    Inscrit en
    Septembre 2011
    Messages
    306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Symfony - CMS Wordpress - Zend
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2011
    Messages : 306
    Points : 101
    Points
    101
    Par défaut
    je parlai de la date et l'heure comme la dit Anapurna.. dans sa réaction.

    la date permettant l’incrément de ton GUID

    il te faut un champs par exemple pour l'heure minute seconde,..
    un champs pour la date
    et ensuite 8 octet choisie aléatoirement entre 0 et 255 tu auras très peu de chance de retrouver le même GUID du fait d’utiliser la date qui est un incrément naturel

  16. #16
    Membre averti
    Homme Profil pro
    Autres
    Inscrit en
    Mai 2017
    Messages
    279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Autres

    Informations forums :
    Inscription : Mai 2017
    Messages : 279
    Points : 421
    Points
    421
    Par défaut
    J'ai bien dit que $chars peut être une REGEX. tu peux y introduire tout ce que tu veux. Que se soit la date, l'heure,... voir même imposer une structure de chaîne de caractère à ta convenance.
    Pour moi, la date et l'heure n'est pas un souci du tout. Tu as tout en main, à toi de personnaliser à ta guise.
    L’appétit vient en mangeant.
    Pourquoi compliquer quand on peut faire plus simple?
    Une réponse vous a été utile? pensez à
    Vous avez eu la réponse à votre question? marquez votre discussion
    Faites un tour aux FAQs et aux tutoriels et cours.

  17. #17
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    hum... si j'ai bien compris le code, ca renvoie les "$length" premiers caractères d'une permutation aléatoire de "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".

    il n'est donc pas possible d'avoir deux fois le même caractère dans la valeur retournée (sauf à demander uuid(37) ou davantage)
    Par exemple, obtenir uuid(4)="B060" est impossible car il y a deux fois le zéro.

    => il faut allonger la chaine pour permettre d'obtenir "$length" fois le même caractère.

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    // while (strlen($chars) < $length) {
       for ($i = 1; $i <= $length; $i++) {
       ...

    Sur le fond de la question, la problématique a déjà causé des débats sur internet (Google: surrogate key integer UUID).
    S'il s'agit de faire un découpage horizontal de la base, on peut effectivement envisager d'utiliser un UUID comme clé primaire.
    S'il s'agit uniquement de différencier des "devices", autant conserver les autoincréments pour les lignes et utiliser le UUID comme colonne supplémentaire.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

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

Discussions similaires

  1. Tirage sur dataframe avec identifiant unique
    Par Stepsbysteps dans le forum R
    Réponses: 6
    Dernier message: 12/04/2013, 16h38
  2. Sélection table avec un identifiant unique
    Par mailbox dans le forum SQL
    Réponses: 6
    Dernier message: 20/04/2012, 15h06
  3. Ajouter une classe avec un identifiant unique
    Par Pierrea4564 dans le forum jQuery
    Réponses: 2
    Dernier message: 27/09/2011, 11h08
  4. [MySQL] Gérer un PDF avec identifiant unique
    Par tomguiss dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 15/03/2010, 12h21
  5. Réponses: 1
    Dernier message: 23/10/2009, 23h12

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