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

Symfony PHP Discussion :

[Symfony2] Génération identifiants uniques


Sujet :

Symfony PHP

  1. #1
    Candidat au Club
    Profil pro
    Lycéen
    Inscrit en
    Août 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Août 2007
    Messages : 3
    Points : 4
    Points
    4
    Par défaut [Symfony2] Génération identifiants uniques
    Bonjour,

    Je suis sur la problématique d'identifiant unique pour mon application. Ces identifiants sont "affichés" sur le site public via un nouveau champ dans mon entité (idPublic). J'ai 2 contraintes:

    1. Les identifiants ne doivent pas être devinés. Donc on oublie l'id auto-généré (XXX1,XXXX2,XXX3...)

    2. Ils doivent être "courts" (< 10 caractères). C'est pour cela que je n'utilise plus la fonction uniqid qui répondait jusqu'à présent très bien à la première contrainte mais plus à celle-ci.

    J'étais parti sur le principe suivant :

    A. Toujours utiliser uniqid qui fournit beaucoup de caractères, mais je le tronque aux 6 ou 7 premiers caractères

    B. Avec ça, il y a du coup des risques non négligeables de collisions entre identifiants. Je voulais donc suffixer ce numéro aléatoire par l'identifiant interne auto-généré par doctrine (1, 2, 3, 4, ....) : idPublic = uniqid + id

    Avec cette méthode, je suis sur d'avoir des identifiants uniques et non devinables. Le problème est l'application de cette méthode. Vu que j'ai besoin de l'id interne, je voulais passer par les évènements doctrine. Le problème est que l'évènement PrePersist n'a pas encore connaissance de l'id auto-généré (ce qui est logique), donc je ne peux pas créer mon idPublic ici ; et dans l'évènement PostPersist, on a bien connaissance de l'id auto-généré, mais les modifications apportées à l'entité ne seront pas appliquées (ce qui est logique, x2), donc pas moyen de sauvegarder l'idPublic calculé....

    Du coup, ma question est simple mais ouverte : y'a-t-il un moyen de faire ce que je veux faire (sans passer par 2 flushs d'affilé, un peu moche...) ; ou : connaissez-vous une "meilleure" solution qui respectent mes 2 contraintes initiales ?

    Merci !

  2. #2
    Membre averti
    Avatar de crozet.magenta
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2012
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2012
    Messages : 208
    Points : 374
    Points
    374
    Par défaut
    bonjour,
    si tu acceptes autre chose que des chiffres, tu peux toujours convertir ton uniqid de base 16 à 62 (0-9a-zA-Z) il tiendra moins de place
    n'oubliez pas de voter si le message vous a aidé


  3. #3
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Hello !

    Si je suis ta logique, tu n'es pas obligé de rajouter l'id de l'entité correspondante, tu peux juste rajouter l'id du dernier élément créé par exemple (tu prends le plus grand identifiant dans la table par exemple).
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    Si tu veux être sûr qu'il n'y a pas de collision, l'unique moyen que je vois c'est de vérifier si l'id est encore disponible ou déjà pris; s'il est déjà pris tu le modifies/régénères/incrémentes puis vérifies de nouveau la disponibilité, et ainsi de suite . Cela t'oblige à faire au moins une requête supplémentaire, mais tu peux te passer de l'id autogénéré et tu ne fais qu'un seul flush.

Discussions similaires

  1. Génération d'identifiant unique en fonction de 3 paramètres (int)
    Par BakaOnigiri dans le forum Général Java
    Réponses: 9
    Dernier message: 14/05/2009, 10h49
  2. [fichier] trouver un identifiant unique
    Par FFF dans le forum Entrée/Sortie
    Réponses: 14
    Dernier message: 16/10/2005, 23h51
  3. [VB6] Génération nombre unique
    Par Overflow64 dans le forum VB 6 et antérieur
    Réponses: 18
    Dernier message: 12/10/2005, 15h05
  4. [DB2] Identifiant unique
    Par kluh dans le forum DB2
    Réponses: 1
    Dernier message: 24/05/2005, 12h20
  5. l'identifiant unique de la dernière ligne insérée
    Par dim_italia dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 23/08/2004, 17h55

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