Question

Comment générer ID unique qui est entier java qui devine pas le numéro suivant?

Était-ce utile?

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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top