web-dev-qa-db-fra.com

Comment créer un identifiant unique en Java?

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

Toute orientation appréciée, merci.

Je devrais mentionner que j'utilise Java 5.

143
Supertux

Créez un UUID .

String uniqueID = UUID.randomUUID().toString();
296
aperkins

Si vous voulez des ID courts et lisibles par l’homme et n’en avez besoin que pour être uniques par exécution de machine virtuelle Java:

private static long idCounter = 0;

public static synchronized String createID()
{
    return String.valueOf(idCounter++);
}    

Edit: Alternative suggérée dans les commentaires - elle s’appuie sur la "magie" cachée pour la sécurité des threads, mais elle est plus évolutive et tout aussi sûre:

private static AtomicLong idCounter = new AtomicLong();

public static String createID()
{
    return String.valueOf(idCounter.getAndIncrement());
}
44
Michael Borgwardt

Java.util.UUID : méthode toString ()

22
Mitch Wheat

Voici mes deux centimes: J'ai déjà implémenté une classe IdFactory qui créait des ID au format [Nom d'hôte] - [heure de début de l'application] - [heure actuelle] - [discriminateur] . Cela garantissait en grande partie que les ID étaient uniques sur toutes les instances de la machine virtuelle Java, tout en les gardant lisibles (bien que assez longs). Voici le code au cas où il serait utile:

public class IdFactoryImpl implements IdFactory {
  private final String 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() {
    String 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 = String.format("%s-%d-%d-%d", hostName, creationTimeMillis, now, discriminator);
    lastTimeMillis = now;

    return id;
  }

  public static void main(String[] args) throws UnknownHostException {
    IdFactory fact = new IdFactoryImpl();

    for (int i=0; i<1000; ++i) {
      System.err.println(fact.createId());
    }
  }
}
16
Adamski

Cela ajoute un peu plus de hasard à la génération d’UUID mais garantit que chaque identifiant généré a la même longueur

import org.Apache.commons.codec.digest.DigestUtils;
import Java.util.UUID;

public String createSalt() {
    String ts = String.valueOf(System.currentTimeMillis());
    String Rand = UUID.randomUUID().toString();
    return DigestUtils.sha1Hex(ts + Rand);
}
8
Robert Alderson

Java - Générer un identifiant unique

UUID est le moyen le plus rapide et le plus simple de générer un identifiant unique en Java.

import Java.util.UUID;

public class UniqueIDTest {
  public static void main(String[] args) {
    UUID uniqueKey = UUID.randomUUID();
    System.out.println (uniqueKey);
  }
}
6
pudaykiran

IMHO aperkins a fourni une solution élégante, car elle est native et utilise moins de code . Mais si vous avez besoin d'un ID 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 String next() {
     UUID u = UUID.randomUUID();
     return toIDString(u.getMostSignificantBits()) + toIDString(u.getLeastSignificantBits());
  }

  private static String toIDString(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 String(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',
    '-','.','_','~'
  };

}
6
rharari

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

String uniqueID = UUID.randomUUID().toString();

Cela générera la variable aléatoire uniqueID dont le type de retour sera String.

2
Prabhat
String name,password;

public int idGen() {

    int id = this.name.hashCode() + this.password.hashCode();
    int length = String.valueOf(id).length();
    int Max_Length = 5;
    if(String.valueOf(id).length()>Max_Length) 
    {
        id = (int) (id /Math.pow(10.0,length - Max_Length ));
    }
    return  id;
}
0
Hatim

Identifiant unique avec informations de comptage

import Java.util.concurrent.atomic.AtomicLong;

public class RandomIdUtils {

    private static AtomicLong atomicCounter = new AtomicLong();

    public static String createId() {

        String currentCounter = String.valueOf(atomicCounter.getAndIncrement());
        String uniqueId = UUID.randomUUID().toString();

        return uniqueId + "-" + currentCounter;
    }
}
0
simhumileco

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
 String randomNum = new Integer(prng.nextInt()).toString();

//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 String(result));

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

UID userId = new UID();
System.out.println("userId: " + userId);
0
Md Ayub Ali Sarker