72 votes

UUID vers un identifiant entier unique ?

Je me demandais quel était le moyen le plus simple de convertir un UUID en un nombre entier unique ? J'ai essayé d'utiliser le code de hachage, mais on me dit qu'il ne sera pas toujours unique si j'utilise le code de hachage ?

Alors, quel est le moyen le plus simple ? Le code de hachage est-il unique ?

1 votes

Non, ça ne l'est pas - par définition. De plus, s'il était unique, pourquoi alors aurait-on besoin d'UUIDs ?

0 votes

Définir unique. Globalement, ou seulement dans votre application, ou dans un bout de code ?

0 votes

Je voulais utiliser la classe UUID, mais il s'avère que je ne peux pas la réduire.

42voto

Jeff Foster Points 22175

Vous allez avoir un problème puisque l'UUID est de 128 bits et que l'int n'est que de 32 bits. Vous devrez soit accepter le risque de collisions et essayer d'utiliser un espace plus petit ( hashCode est probablement un bon moyen de le faire) ou de trouver une alternative (utiliser la fonction UUID directement, correspond à un BigInteger - difficile à dire sans savoir pourquoi)

17voto

pgras Points 7202

Répondre à la question "Comment puis-je avoir une application unique de Integer" :

S'il doit être unique même après les redémarrages ou si votre application est en grappe, vous pouvez utiliser une séquence de base de données.

S'il doit simplement être unique pendant l'exécution, utilisez un fichier statique AtomicInteger .

EDIT (exemple ajouté) :

public class Sequence {

  private static final AtomicInteger counter = new AtomicInteger();

  public static int nextValue() {
    return counter.getAndIncrement();
  }
}

Utilisation :

int nextValue = Sequence.nextValue();

Ceci est thread safe (les différents threads recevront toujours des valeurs distinctes, et aucune valeur ne sera "perdue").

5voto

hodzanassredin Points 396

Nous devions convertir tous nos UUID en numéros de série. Enfin, nous avons testé et utilisé l'algorithme suivant :

  1. Obtenir le CRC64 de l'uuid (16 octets) en utilisant le polynôme ECMA 0xC96C5795D7870F42. N'utilisez pas le polynôme ISO, car il pourrait entraîner beaucoup de collisions pour certains algorithmes de génération d'UUID.

  2. Maintenant nous avons crc64(8 octets). Prenez les N premiers octets (dans notre cas 5 dans le votre ce sera 4 octets pour int et tous les octets pour int64)

Nous avons testé cette méthode et elle fonctionne bien pour plusieurs millions d'UUID.

Notre étape supplémentaire : convertir le nombre de 5 octets en un nombre en base 36 et finalement nous avons SN : 4YD3SOJB.

5voto

Andreas_D Points 64111

Un UUID est un nombre de 16 octets (128 bits). Vous ne pouvez pas le transformer en un int (32 bits) tout en préservant son caractère unique.

Mathématiquement parlant : 2 96 Les UUIDs partageront le même Java- int -taille de la valeur de hachage (qui est ... beaucoup ;) )

Une porte de sortie - certains UUID de la vie réelle ont souvent une partie plutôt statique. Ainsi, dans des scénarios isolés, le réel partie unique des UUIDs puede être inférieure à 32 bits.

2voto

Joey Points 148544

Non, le code de hachage n'est pas (et ne peut pas être) unique. Le problème avec un GUID/UUID est que vous avez besoin de tous les 128 bits pour garantir l'unicité, donc le réduire de quelque manière que ce soit posera des problèmes, voir par ex. Les GUIDs sont globalement uniques, mais les sous-chaînes de GUIDs ne le sont pas. .

Honnêtement, je pense que vous feriez mieux d'utiliser des entiers séquentiels et de ne pas utiliser le GUID. Si vous avez besoin de GUIDs pour une raison quelconque, alors utilisez-les et n'essayez pas de générer un entier à partir d'eux.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X