Comment créer un identifiant unique en Java?

Je cherche le meilleur moyen de créer un identifiant unique en tant que chaîne en Java.

Toute orientation appréciée, merci.

Je devrais mentionner que j’utilise Java 5.

Créez un UUID .

Ssortingng uniqueID = UUID.randomUUID().toSsortingng(); 

Si vous voulez des identifiants courts et lisibles par l’homme et qu’ils n’ont besoin d’être uniques que par exécution de JVM:

 private static long idCounter = 0; public static synchronized Ssortingng createID() { return Ssortingng.valueOf(idCounter++); } 

Edit: Alternative suggérée dans les commentaires – celle-ci repose sur la “magie” sous-jacente pour la sécurité des threads, mais est plus évolutive et tout aussi sûre:

 private static AtomicLong idCounter = new AtomicLong(); public static Ssortingng createID() { return Ssortingng.valueOf(idCounter.getAndIncrement()); } 

java.util.UUID : méthode toSsortingng ()

Voici mes deux centimes: J’ai déjà implémenté une classe IdFactory qui créait des identifiants au format [nom d’hôte] – [heure de début de l’application] – [heure actuelle] – [discriminateur] . Cela garantissait largement que les identifiants étaient uniques sur toutes les instances de la JVM tout en gardant les identifiants lisibles (quoique assez longs). Voici le code en cas d’utilisation:

 public class IdFactoryImpl implements IdFactory { private final Ssortingng hostName; private final long creationTimeMillis; private long lastTimeMillis; private long discriminator; public IdFactoryImpl() throws UnknownHostException { this.hostName = InetAddress.getLocalHost().getHostAddress(); this.creationTimeMillis = System.currentTimeMillis(); this.lastTimeMillis = creationTimeMillis; } public synchronized Serializable createId() { Ssortingng id; long now = System.currentTimeMillis(); if (now == lastTimeMillis) { ++discriminator; } else { discriminator = 0; } // creationTimeMillis used to prevent multiple instances of the JVM // running on the same host returning clashing IDs. // The only way a clash could occur is if the applications started at // exactly the same time. id = Ssortingng.format("%s-%d-%d-%d", hostName, creationTimeMillis, now, discriminator); lastTimeMillis = now; return id; } public static void main(Ssortingng[] args) throws UnknownHostException { IdFactory fact = new IdFactoryImpl(); for (int i=0; i<1000; ++i) { System.err.println(fact.createId()); } } } 

Cela ajoute un peu plus de caractère aléatoire à la génération UUID mais garantit que chaque identifiant généré est de la même longueur

 import org.apache.commons.codec.digest.DigestUtils; import java.util.UUID; public Ssortingng createSalt() { Ssortingng ts = Ssortingng.valueOf(System.currentTimeMillis()); Ssortingng rand = UUID.randomUUID().toSsortingng(); return DigestUtils.sha1Hex(ts + rand); } 

Java – Génère un ID unique

UUID est le moyen le plus rapide et le plus simple de générer des identifiants uniques en Java.

 import java.util.UUID; public class UniqueIDTest { public static void main(Ssortingng[] args) { UUID uniqueKey = UUID.randomUUID(); System.out.println (uniqueKey); } } 

IMHO aperkins pourvu qu’une solution élégante soit native et utilise moins de code. Mais si vous avez besoin d’un identifiant plus court, vous pouvez utiliser cette approche pour réduire la longueur de chaîne générée:

 // usage: GenerateShortUUID.next(); import java.util.UUID; public class GenerateShortUUID() { private GenerateShortUUID() { } // singleton public static Ssortingng next() { UUID u = UUID.randomUUID(); return toIDSsortingng(u.getMostSignificantBits()) + toIDSsortingng(u.getLeastSignificantBits()); } private static Ssortingng toIDSsortingng(long i) { char[] buf = new char[32]; int z = 64; // 1 << 6; int cp = 32; long b = z - 1; do { buf[--cp] = DIGITS66[(int)(i & b)]; i >>>= 6; } while (i != 0); return new Ssortingng(buf, cp, (32-cp)); } // array de 64+2 digitos private final static char[] DIGITS66 = { '0','1','2','3','4','5','6','7','8','9', 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z', 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z', '-','.','_','~' }; } 

Nous pouvons créer un identifiant unique en Java en utilisant l’ UUID et appeler la méthode comme randomUUID() sur UUID .

 Ssortingng uniqueID = UUID.randomUUID().toSsortingng(); 

Cela générera un uniqueID aléatoire dont le type de retour sera Ssortingng .

Il y a trois façons de générer un identifiant unique en Java.

1) la classe UUID fournit un moyen simple de générer des identifiants uniques.

  UUID id = UUID.randomUUID(); System.out.println(id); 

2) SecureRandom et MessageDigest

 //initialization of the application SecureRandom prng = SecureRandom.getInstance("SHA1PRNG"); //generate a random number Ssortingng randomNum = new Integer(prng.nextInt()).toSsortingng(); //get its digest MessageDigest sha = MessageDigest.getInstance("SHA-1"); byte[] result = sha.digest(randomNum.getBytes()); System.out.println("Random number: " + randomNum); System.out.println("Message digest: " + new Ssortingng(result)); 

3) en utilisant un java.rmi.server.UID

 UID userId = new UID(); System.out.println("userId: " + userId); 

ID unique avec informations de compte

 import java.util.concurrent.atomic.AtomicLong; public class RandomIdUtils { private static AtomicLong atomicCounter = new AtomicLong(); public static Ssortingng createId() { Ssortingng currentCounter = Ssortingng.valueOf(atomicCounter.getAndIncrement()); Ssortingng uniqueId = UUID.randomUUID().toSsortingng(); return uniqueId + "-" + currentCounter; } } 
 Ssortingng name,password; public int idGen() { int id = this.name.hashCode() + this.password.hashCode(); int length = Ssortingng.valueOf(id).length(); int Max_Length = 5; if(Ssortingng.valueOf(id).length()>Max_Length) { id = (int) (id /Math.pow(10.0,length - Max_Length )); } return id; } 
 enter code here 

Programme pour générer des identifiants uniques

 class Test { public static void main(Ssortingng arg[]) { Ssortingng s = ""; double d; for (int i = 1; i <= 16; i++) { d = Math.random() * 10; s = s + ((int)d); if (i % 4 == 0 && i != 16) { s = s + "-"; } } System.out.println(s); } } 

Sortie:

 7954-7605-1827-4795 1991-4912-4912-3008