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.
Créez un UUID .
String uniqueID = UUID.randomUUID().toString();
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());
}
Java.util.UUID
: méthode toString ()
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());
}
}
}
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);
}
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);
}
}
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',
'-','.','_','~'
};
}
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
.
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;
}
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;
}
}
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);