Comment générer un ID unique qui est un entier en Java qui ne devine pas le numéro suivant?
À quel point doit-elle être unique?
S'il n'est unique qu'au sein d'un processus, vous pouvez utiliser un AtomicInteger
et appeler incrementAndGet()
chaque fois que vous avez besoin d'une nouvelle valeur.
int uniqueId = 0;
int getUniqueId()
{
return uniqueId++;
}
Ajoutez synchronized
si vous voulez qu'il soit sûr pour les threads.
C'est facile si vous êtes quelque peu contraint.
Si vous avez un thread, vous utilisez simplement uniqueID ++; Assurez-vous de stocker l'identifiant unique actuel lorsque vous quittez.
Si vous avez plusieurs threads, une méthode synchronisée generateUniqueID commune fonctionne (implémentée de la même manière que ci-dessus).
Le problème est lorsque vous avez plusieurs processeurs - dans un cluster ou dans une configuration distribuée comme un jeu peer-to-peer.
Dans ce cas, vous pouvez généralement combiner deux parties pour former un seul numéro. Par exemple, chaque processus qui génère un ID unique peut avoir son propre numéro d'ID à 2 octets, puis le combiner avec un uniqueID ++. Quelque chose comme:
return (myID << 16) & uniqueID++
Il peut être difficile de distribuer la partie "myID", mais il existe plusieurs moyens. Vous pouvez simplement en extraire une dans une base de données centralisée, demander un identifiant unique à un serveur centralisé, ...
Si vous aviez un Long au lieu d'un Int, l'une des astuces les plus courantes consiste à prendre l'ID d'appareil (UUID) d'ETH0, qui est garanti d'être unique sur un serveur - puis ajoutez simplement un numéro de série.
Si vous vouliez vraiment dire entier plutôt qu'int:
Integer id = new Integer(42); // will not == any other Integer
Si vous voulez quelque chose de visible en dehors d'une machine virtuelle Java pour d'autres processus ou pour l'utilisateur, persistant ou un hôte d'autres considérations, alors il existe d'autres approches, mais sans contexte, vous feriez probablement mieux d'utiliser en utilisant l'unicité intégrée de l'identité d'objet dans votre système.
Générez simplement l'ID et vérifiez s'il est déjà présent ou non dans votre liste d'ID générés.
En avez-vous besoin?
import Java.util.UUID;
public class IdGenerator {
public static int generateUniqueId() {
UUID idOne = UUID.randomUUID();
String str=""+idOne;
int uid=str.hashCode();
String filterStr=""+uid;
str=filterStr.replaceAll("-", "");
return Integer.parseInt(str);
}
// XXX: replace with Java.util.UUID
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
System.out.println(generateUniqueId());
//generateUniqueId();
}
}
}
J'espère que cela vous aidera.