web-dev-qa-db-fra.com

Comment générer un identifiant unique dans Java (entier)?

Comment générer un ID unique qui est un entier en Java qui ne devine pas le numéro suivant?

22
Sajad Bahmani

À 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.

54
Simon Nickerson
int uniqueId = 0;

int getUniqueId()
{
    return uniqueId++;
}

Ajoutez synchronized si vous voulez qu'il soit sûr pour les threads.

8
Mark Byers

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.

4
Bill K

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.

2
Pete Kirkham

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.

1
Mykola Golubyev
1
Jim Barrows

En avez-vous besoin?

  • unique entre deux JVM fonctionnant en même temps.
  • unique même si la JVM est redémarrée.
  • thread-safe.
  • support null? sinon, utilisez int ou long.
1
Peter Lawrey
 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.

1
user1614168