Comment générer ID unique en Java (entier)?
-
24-09-2019 - |
Question
Comment générer ID unique qui est entier java qui devine pas le numéro suivant?
La solution
Comment unique, il faut être?
Si ce n'est unique dans un processus, vous pouvez utiliser un AtomicInteger
et appel incrementAndGet()
chaque fois que vous avez besoin d'une nouvelle valeur.
Autres conseils
int uniqueId = 0;
int getUniqueId()
{
return uniqueId++;
}
Ajouter synchronized
si vous voulez qu'il soit thread-safe.
Il est facile si vous êtes un peu contraint.
Si vous avez un fil, vous utilisez juste uniqueID ++; Assurez-vous de stocker le uniqueID courant lorsque vous quittez.
Si vous avez plusieurs threads, une méthode de synchronisation generateUniqueID commun fonctionne (Mis en œuvre comme ci-dessus).
Le problème est quand vous avez beaucoup de processeurs -. Soit dans un cluster ou 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 identifiant unique peut avoir son propre numéro d'identification 2 octets attribué, puis le combiner avec un uniqueID ++. Quelque chose comme:
return (myID << 16) & uniqueID++
Il peut être difficile distribuer la partie « myID », mais il y a des façons. Vous pouvez simplement prendre un sur une base de données centralisée, demander un identifiant unique à partir d'un serveur centralisé, ...
Si vous aviez une longue place d'un Int, l'un des trucs communs est de prendre l'identifiant de l'appareil (UUID) de eth0, qui est garanti d'être unique à un serveur -. Puis il suffit d'ajouter un numéro de série
Si vous entier vraiment voulu dire plutôt que int:
Integer id = new Integer(42); // will not == any other Integer
Si vous voulez quelque chose de visible à l'extérieur d'une machine virtuelle Java à d'autres processus ou à l'utilisateur, persistant ou une foule d'autres considérations, alors il y a d'autres approches, mais sans contexte vous êtes probablement mieux à l'aide en utilisant le caractère unique intégré de l'identité des objets au sein de votre système.
Il suffit de générer ID et vérifier si elle est déjà présente ou non dans votre liste d'identifiants générés.
Avez-vous besoin d'être;
- unique entre deux JVMs en cours d'exécution à le même temps.
- unique, même si la machine virtuelle Java est redémarré.
- thread-safe.
- null soutien? sinon, l'utilisation int ou long.
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();
}
}
}
Espérons que cela vous aide.
Unique à tout moment:
int uniqueId = (int) (System.currentTimeMillis() & 0xfffffff);