web-dev-qa-db-fra.com

UUID en id unique entier?

Je me demandais quel serait le moyen le plus simple de convertir un UUID en un entier unique? J'ai essayé d'utiliser le code de hachage mais les gens me disent que cela 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?

42

Vous allez avoir un problème puisque l'UUID est de 128 bits et que l'int est de 32 bits seulement. Vous devrez soit accepter le risque de collision et tenter de le réduire à un espace plus petit (hashCode est probablement un bon moyen de le faire) ou trouver une alternative (utilisez directement la UUID, mappez-la sur une BigInteger - difficile à déterminer sans sachant pourquoi)

29
Jeff Foster

Répondre à Comment puis-je avoir un entier unique d'application large:

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

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

EDIT (exemple ajouté):

public class Sequence {

  private static final AtomicInteger counter = new AtomicInteger();

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

Usage:

int nextValue = Sequence.nextValue();

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

10
pgras

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é. Par conséquent, le réduire de quelque manière que ce soit donnera des problèmes, voir par exemple Les GUID sont globalement uniques, mais les sous-chaînes de GUID ne sont pas .

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

2
Joey

Un UUID est un nombre de 16 octets (128 bits). Vous ne pouvez pas le réduire en une int (32 bits) tout en préservant son unicité. 

Mathématiquement parlée: 296 Les UUID partageront la même valeur de hachage Java -int- taille (qui est ... beaucoup;))

Une issue - certains UUID de la vie réelle ont souvent une partie plutôt statique. Ainsi, dans des scénarios isolés, la réelle partie unique d'UUID peut sera inférieure à 32 bits.

1
Andreas_D

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

  1. Obtenez le CRC64 d'uuid (16 octets) à l'aide du polynôme ECMA 0xC96C5795D7870F42. N'utilisez pas de polynôme ISO, car cela pourrait causer 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 vôtre, il sera de 4 octets pour int et de 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 un nombre de 5 octets en un nombre de base 36 et enfin nous avons SN: 4YD3SOJB.

0
Anton Shelin