Comment puis-je assembler des bits dans un long pour créer un identifiant unique?

StackOverflow https://stackoverflow.com/questions/317617

  •  11-07-2019
  •  | 
  •  

Question

Je voudrais écrire un utilitaire qui me fournira un identifiant relativement unique en Java. Quelque chose de simple, comme x bits de timestamp + y bits de nombres aléatoires.

Alors, comment pourrais-je implémenter la méthode suivante:

long getUniqueID()
{
    long timestamp = System.currentTimeMillis();
    long random = some random long

    ...

    return id;
}

BONUS

Avez-vous des suggestions pour d’autres informations faciles à obtenir que je pourrais utiliser pour former mon identifiant?

note: je connais les GUID et je sais que Java a une classe UUID, mais je ne veux pas de quelque chose de 128 bits.

Était-ce utile?

La solution

Découpez simplement les éléments dont vous n'avez pas besoin:

return java.util.UUID.randomUUID().getLeastSignificantBits();

Autres conseils

Vous essayez de créer une fonction de hachage qui combine deux valeurs longues dans une seule valeur longue. Dans ce cas, la uniformité de la fonction de hachage sera de la plus haute importance, car les collisions dans Les valeurs d'identifiant uniques créées sont inacceptables. Toutefois, si vous pouvez comparer les valeurs de hachage aux identificateurs créés précédemment, vous pouvez résoudre les conflits en modifiant le hachage jusqu'à ce qu'aucune collision ne se produise.

Par exemple, vous pouvez utiliser l'horodatage et effectuer un exclusive-ou (en utilisant l'opérateur caret ^ en Java) avec la valeur aléatoire. Si une collision est détectée, ajoutez-en une au résultat.

S'il est unique dans la même machine virtuelle Java, cela devrait suffire.

public class UniqueID {
  static long current= System.currentTimeMillis();
  static public synchronized long get(){
    return current++;
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top