Je cherche le meilleur moyen de créer un identifiant unique en tant que chaîne en Java.
Tout conseil apprécié, merci.
Je devrais mentionner que j'utilise Java 5.
Je cherche le meilleur moyen de créer un identifiant unique en tant que chaîne en Java.
Tout conseil apprécié, merci.
Je devrais mentionner que j'utilise Java 5.
Si vous voulez des identifiants courts et lisibles par l'homme et que vous avez seulement besoin qu'ils soient uniques par exécution JVM :
private static long idCounter = 0;
public static synchronized String createID()
{
return String.valueOf(idCounter++);
}
Modifier : Alternative suggérée dans les commentaires - cela repose sur la « magie » sous le capot pour la sécurité du fil, mais est plus évolutive et tout aussi sûre :
private static AtomicLong idCounter = new AtomicLong();
public static String createID()
{
return String.valueOf(idCounter.getAndIncrement());
}
java.util.UUID
: méthode toString()
Voici la valeur de mes deux cents : J'ai déjà implémenté une classe IdFactory
qui a créé des ID au format [host name]-[application start time]-[current time]-[discriminator]. Cela garantissait en grande partie que les ID étaient uniques dans toutes les instances JVM tout en gardant les ID 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());
}
}
}
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.