UUID unique d'identification entier?
Je me demandais ce que la façon la plus facile de convertir un UUID pour un entier unique serait? J'ai essayé d'utiliser le code de hachage, mais les gens me dire qu'il ne va pas toujours être unique si j'utilise le code de hachage?
Alors, quel est le moyen le plus facile? Est le code de hachage unique?
- Non, ce n'est pas par définition. Aussi, si elle était unique, pourquoi, alors, serait quelqu'un besoin d'Uuid?
- Définir unique. À l'échelle mondiale, ou tout simplement dans votre application, ou un peu de code?
- C'est juste que par certains idiot spécification j'ai besoin d'une application unique entier, je voulais utiliser l'UUID de la classe, mais il s'avère que je ne peux pas en bas de l'échelle.
- Il serait plus facile si vous avez posé la vraie question: comment puis-je avoir une application unique entier ? pourrais-je convertir un UUID pour elle ? Puis nous avons pu répondre à votre problème et pas seulement vous dire que vous ne pouvez pas utiliser l'UUID pour cette fin...
Vous devez vous connecter pour publier un commentaire.
Vous allez avoir un problème depuis l'UUID est de 128 bits et l'int est seulement de 32 bits. Vous devrez accepter le risque de collisions et d'essayer de fudge à un plus petit espace (
hashCode
est probablement une bonne façon de le faire) ou de trouver une alternative (utiliser leUUID
directement, la carte à uneBigInteger
- difficile à dire sans savoir pourquoi)De répondre au Comment puis-je disposer d'une application unique à l'échelle Entier:
Si elle doit être unique, même après redémarrage ou si vous l'application en cluster, vous pouvez utiliser une Base de données de séquence.
Si il a juste besoin d'être unique lors de l'exécution d'utilisation statique AtomicInteger.
MODIFIER (exemple ajouté):
Utilisation:
C'est thread-safe (threads différents recevrez toujours des valeurs distinctes, et aucune valeur ne sera "perdu")
Non, le code de hachage n'est pas (et ne peut pas être unique. La chose avec un GUID/UUID est que vous avez besoin tous les 128 bits pour garantir l'unicité, donc mise à l'échelle vers le bas, en aucune façon va donner des problèmes, voir, par exemple,Guid-globally unique, mais des sous-chaînes de Guid ne sont pas.
Honnêtement, je pense que vous êtes mieux avec l'aide séquentielle entiers et passez le GUID chose complètement différente. Si vous avez besoin d'Guid pour une raison quelconque, puis de les utiliser et de ne pas essayer de générer un nombre entier d'eux.
Un UUID est un 16-nombre d'Octets (128 bits). Vous ne pouvez pas les traiter dans un
int
(32 bits), tout en le préservant son caractère unique.Mathématiquement parlées: 296 Uuid de partager les mêmes Java-
int
-taille de la valeur de hachage (qui est ... beaucoup 😉 )Un moyen de sortir - réel UUID ont souvent un plutôt statique de la partie. Donc isolé de scénarios, la réel partie unique de Uuid peut être inférieure à 32 bits.
Nous avons eu une demande de convertir l'ensemble de nos Uuid dans les numéros de série. Enfin, nous avons testé et utilisé l'algorithme suivant:
Obtenir CRC64 de l'uuid(16 octets) à l'aide de l'ECMA polynôme
0xC96C5795D7870F42. Ne pas utiliser la norme ISO polynôme, car il pourrait causer
beaucoup de collisions pour certains UUID algorithmes de génération.
Maintenant, nous avons crc64(8 octets). Prendre les N premiers octets(dans notre cas
5 dans le vôtre, il sera de 4 octets pour les int et tous les octets pour int64)
Nous avons testé cette méthode et ça fonctionne bien pour plusieurs millions d'Uuid.
Notre étape supplémentaire: convertir 5 octets nombre dans un numéro de la base de 36 et enfin, nous avons SN: 4YD3SOJB.