Question

Je dois générer un nombre unique de 32 bits en Java. Je dois retourner le numéro comme Java int, qui est requis par l'interface. Pouvez-vous s'il vous plaît partager quelques idées sur ce sujet?

Le nombre sera utilisé comme PK MySQL et plusieurs threads peuvent être génèrent leurs propres identifiant unique en même temps. (Désolé, il est décidé de ne pas utiliser id incrémentale MySQL)

J'ai essayé classe UUID mais il semble que les données qu'elle génère a plus de bits que je peux utiliser.

J'ai trouvé cela, mais pas sûr que cela fonctionne:

    // seems no way to get int
    UUID id = UUID.randomUUID();
    System.out.println(id);

    // not working either?
    java.rmi.server.UID uid = new java.rmi.server.UID();
    System.out.println(uid.toString());

    // the one i am using
    SecureRandom prng = SecureRandom.getInstance("SHA1PRNG");
    prng.setSeed(System.currentTimeMillis());
    int ret = prng.nextInt();
    System.out.println(ret);
Était-ce utile?

La solution

Comment "unique" êtes-vous vouloir? En bref, quel est le domaine de collision? Si vous faites affaire avec des milliers de clés puis Random.nextInt () fait exactement ce que vous voulez par rapport à ce que vous avez essayé avec la version 4 UUID (UUID v4 génère 128 bits aléatoires).

Si vous avez besoin de quelque chose avec moins de chance de collision alors vous devez avoir un entier incrémentée à l'échelle mondiale, mais il y a beaucoup de soin à prendre ici comme le maintien de l'état entre les start-up JVM. Pour cela, vous devriez regarder dans AtomicInteger .

Autres conseils

L'approche SecureRandom est très bien, mais ne fixe pas la graine sur elle. Il choisira sa propre semence de manière sécurisée (sans doute).

Vous pouvez également utiliser un UUID et juste jeter les bits que vous n'avez pas besoin, par exemple.

int key = (int)UUID.randomUUID().getLeastSignificantBits();

EDIT: Vous devez également savoir que le SecureRandom est nettement plus lent que Random. Puisque vous ne faites Crypto ici, pourquoi ne pas utiliser Random?

Je pense que vous pouvez utiliser une fonction de hachage 32 bits. les détails sont donnés dans le tutoriel suivant http://www.concentric.net/~ttwang/tech/inthash.htm

private static int hash(int key){

          key = ~key + (key << 15); // key = (key << 15) - key - 1;
          key = key ^ (key >>> 12);
          key = key + (key << 2);
          key = key ^ (key >>> 4);
          key = key * 2057; // key = (key + (key << 3)) + (key << 11);
          key = key ^ (key >>> 16);
          return key;

    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top