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

avec Java Discussion :

générer un String


Sujet :

avec Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juillet 2008
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 56
    Points : 38
    Points
    38
    Par défaut générer un String
    bonjour a tous (omg je viens de voir que le titre de mon topic a une certaine ambiguitée)

    Bref, j'ai besoin de créer un code UNIQUE dans mon application pour certain objet que je vais enregistrer en base, je me suis dis que un String de 10 de long avec des lettres (que en minuscule) et des chiffres aléatoire c'été pas mal.

    Seulement voila, comment faire ? existe t'il deja un code ou une méthode pour cela ?

    je voulais utiliser la methode random, mais est t'elle assez sur sur le coté aléatoire?

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Je pense que la génération aléatoire n'est pas une bonne idée.
    Il est préférable de sauver quelque part (base de données, fichier...) la dernière chaîne utilisée puis de l'incrémenter de 1 dans la table des caractères. Tu es donc assurément sûr à 100% que la chaîne est unique.

  3. #3
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    D'abord, quel niveau d'unicité veux-tu?

    unique pour une exécution?
    unique dans la db?
    globalement unique (pour toutes les exécutions et pour plusieurs db, sans lien entre les programmes).


    Pour le premier, un random avec un Set des élément déjà générés devrait suffire (tu génère aléatoirement, tu vérifie que çà n'existe pas déjà)
    Pour le deuxième cas, il vaut mieux s'orienter sur les structures de la db. Oracle, par exemple, fourni les "sequence", compteur qui s'incrémente uniquement et que tu appelle pour avoir un numéro unique.
    Pour le troisième, il faut s'orienter sur les algorithme de génération de UUID (universal unique id) mais qui nécessite souvent des informations unique de départ comme une mac address de la carté réseau ou autre (difficile à implémenter en pur java)

  4. #4
    Membre éprouvé
    Profil pro
    Développeur Back-End
    Inscrit en
    Avril 2003
    Messages
    782
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Avril 2003
    Messages : 782
    Points : 935
    Points
    935
    Par défaut
    Bonjour,

    pour ce qui est de générer un id unique, tu peux rechercher sur internet UUID. Actuellement j'utilise celui de johann burkard.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Juillet 2008
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 56
    Points : 38
    Points
    38
    Par défaut
    je vais préciser plus mon problème :
    j'ai ce que j'appel des "Element" en base de donnée. Pour chaque Element, il y a une date ainsi qu'une valeur et dautre truc a la con. certains de ces Elements sont extraits de la base par une méthode qui sappuit sur une plage de date ainsi que sur un code le fameux CodeElement (qui est present en attribut dans chaque Element). Ce code permet de les regrouper en sorte de catégorie (car il n'y a qu'une table pour les gerer les Element en base -> contrainte) seulement les Elements doivent poceder aussi un identifiant unique (j'utilise celui attribué par BDD a la creation, actuellement)
    il faut donc quand je veut créer un nouveau groupe d'Element, creer un element avec un nouveau code et jen profite pour le tager avec un booleen histoire de bien voir que c'est le premier Element qui a été créer dans ce groupe.

    oui ca parait super tordu (ou pas) , mais ce shema d'organisation m'est imposé.

    Je cherche donc un methode pour générer un String de 10 de long (lettre + chiffre) de la manière la plus aleatoire possible. si possible la plus global possible, je vais bienentndu tester ce code au préalable pour verifier s'il existe deja en base.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Juillet 2008
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 56
    Points : 38
    Points
    38
    Par défaut
    mon problème devient en fait assez simple du fait que je fasse un test sur l'existance du code dans la DB. Mais je viens du monde Dotnet, je découvre le Java.

    Donc je viens chercher des conseil sur les méthodes à ma portée =)

    ou si possible une méthode toute prête :p

  7. #7
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    regarde le lien de fnobb, t'aura meme pas a faire de test sur ta db avec çà normalement.

  8. #8
    Nouveau membre du Club
    Inscrit en
    Juillet 2008
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 56
    Points : 38
    Points
    38
    Par défaut
    donc si j'ai bien lu le lien proposé avec les classe UUID si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UUID u1 = new UUID(4242L, 4242L);
    UUID u2 = new UUID(4242L, 4242L);
    u1 et u2 seront forcement différents ?

    EDIT : c'est mort :p j'ai pas la place pour une valeur de 128 bit (autre contrainte, un string de 10 de long avec un test DB m'ira parfaitement.

  9. #9
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    si c'est jsute un problème de stockage dans la db, utilise les outils de la db, il font déjà ce genre de truc. Exemple en oracle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select maSequence.nextval from dual;
    et hop, t'as un numéro unique qui sera pas réutilisé

  10. #10
    Nouveau membre du Club
    Inscrit en
    Juillet 2008
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 56
    Points : 38
    Points
    38
    Par défaut
    bon jai essayer de me bidouiller un truc, mais debutant en java j'aurai voulu s'avoir si c'était propre niveau java.

    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
    	public String generateCodeElement() 
    	throws ServiceException{
    		try{
    			//variables
    			String base = "abcdefghijklmnopqrstuvwxyz0123456789";
    			Random r = new Random();
    			char[] buffer = new char[10];
     
    			//balayage de la variable(tableau) de retour
    			for(int i=0;i<buffer.length;i++)
    			{	//recupération d'une valeur au pif dans la variable "base"
    				buffer[i] = base.charAt(r.nextInt(base.length()));
    			}
    			//création de la valeur de retour 
    			return new String(buffer);
     
    		} catch (Exception e) {
    			throw new ServiceException(e);
    		}
    	}
    c'est méthode n'étant présente qu'une et une seule fois seulement dans cette classe, j'ai éviter de déclarer les longueurs en static ou les récupérer en paramètre. Merci pour votre aide et vos retours.

    Note : il y a forcement un risque qu'il ne soit pas unique, mais je test la DB en focntion du code récupéré.

  11. #11
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Citation Envoyé par ironfalcon Voir le message
    Note : il y a forcement un risque qu'il ne soit pas unique, mais je test la DB en focntion du code récupéré.
    Puisque tu testes la DB justement, tu pourrais remplir une liste contenant toutes les chaînes différentes, tu les tries par ordre alphabétique (c'est la DB qui le fait), puis :
    1. initialiser N à 1
    2. c = la chaîne N dans la liste
    3. incrémenter c de 1
    4. si c == N+1, alors N = N + 1 et recommencer à l'étape 2

    A la fin de cette algo, tu as ta chaîne. Ca évite de construire une chaîne aléatoire avec le risque de recommencer si elle existe déjà.

  12. #12
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    Citation Envoyé par ironfalcon Voir le message
    bon jai essayer de me bidouiller un truc, mais debutant en java j'aurai voulu s'avoir si c'était propre niveau java.
    alors catch (Exception e), on évite de faire, çà catche tout. Si tu veux faire propre, tu catch ce que tu dois, tu laisse remonter ce qui ne te concerne pas.
    Ensuite, tu crée un objet random dans ta méthode. Cet objet est initialisé en fonction de l'heure courante, avec un certaines granularité (voir la doc java, c'et expliqué) ce qui signigife que plusieurs appels rapprochés à cette méthode, genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    a.setId(generateCodeElement());
    b.setId(generateCodeElement());
    c.setId(generateCodeElement());
    store(a);
    store(b);
    store(c);
    As toutes les chances de générer le même identifiant pour a,b,c

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

Discussions similaires

  1. générer un string de 01 a 100
    Par coolirc dans le forum Débuter
    Réponses: 7
    Dernier message: 26/01/2014, 19h22
  2. script Dos pour générer un fichier avec une string
    Par yanis97 dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 16/10/2009, 16h57
  3. Générer une string aléatoire
    Par eG.dam dans le forum C++
    Réponses: 2
    Dernier message: 22/06/2006, 00h17
  4. Réponses: 6
    Dernier message: 03/03/2006, 09h06
  5. String Grid et choix d'une couleur pour une ligne
    Par Gigottine dans le forum C++Builder
    Réponses: 12
    Dernier message: 17/05/2002, 15h23

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