J'ai du code qui ressemble à ceci:
u := make([]byte, 16)
_, err := rand.Read(u)
if err != nil {
return
}
u[8] = (u[8] | 0x80) & 0xBF // what does this do?
u[6] = (u[6] | 0x40) & 0x4F // what does this do?
return hex.EncodeToString(u)
Il renvoie une chaîne d'une longueur de 32, mais je ne pense pas que ce soit un UUID valide. S'il s'agit d'un UUID réel, pourquoi s'agit-il d'un UUID et quel est le but du code qui modifie la valeur de u[8]
et u[6]
.
Existe-t-il un meilleur moyen de générer des UUID?
Réponses:
Ces lignes fixent les valeurs des octets 6 et 8 à une plage spécifique.
rand.Read
renvoie des octets aléatoires dans la plage0-255
, qui ne sont pas toutes des valeurs valides pour un UUID. Pour autant que je sache, cela devrait être fait pour toutes les valeurs de la tranche.Si vous êtes sous Linux, vous pouvez également appeler
/usr/bin/uuidgen
.Ce qui donne:
la source
u[6]
etu[8]
.Vous pouvez générer des UUID à l'aide de la bibliothèque go-uuid . Cela peut être installé avec:
Vous pouvez générer des UUID aléatoires (version 4) avec:
Le
UUID
type renvoyé est un tableau de 16 octets, vous pouvez donc récupérer facilement la valeur binaire. Il fournit également la représentation sous forme de chaîne hexadécimale standard via saString()
méthode.Le code que vous avez semble également générer un UUID version 4 valide: la manipulation au niveau du bit que vous effectuez à la fin définit les champs de version et de variante de l'UUID pour l' identifier correctement comme version 4 . Ceci est fait pour distinguer les UUID aléatoires de ceux générés via d'autres algorithmes (par exemple, les UUID de la version 1 en fonction de votre adresse MAC et de l'heure).
la source
La
go-uuid
bibliothèque n'est PAS conforme à la RFC4122. Les bits de variante ne sont pas définis correctement. Des membres de la communauté ont tenté à plusieurs reprises de corriger ce problème, mais les pull requests pour le correctif ne sont pas acceptées.Vous pouvez générer des UUID à l'aide de la bibliothèque Go uuid que j'ai réécrite en fonction de la
go-uuid
bibliothèque. Il existe plusieurs correctifs et améliorations. Cela peut être installé avec:Vous pouvez générer des UUID aléatoires (version 4) avec:
Le type UUID renvoyé est une interface et le type sous-jacent est un tableau.
La bibliothèque génère également des UUID v1 et génère correctement des UUID v3 et 5. Il existe plusieurs nouvelles méthodes pour faciliter l'impression et le formatage, ainsi que de nouvelles méthodes générales pour créer des UUID basés sur des données existantes.
la source
"crypto / rand" est un paquet multiplateforme pour la génération aléatoire d'octets
la source
pseudo_uuid
parce qu'il manque les identifiants non aléatoires comme l'adresse MAC et tout ce que RFC4122 spécifie? Donc c'est en fait plus aléatoire.%x
des problèmes avec des valeurs d'octets inférieures à 128, vous devez appliquer un remplissage, c'est-%04x
à- dire pour une paire d'octetsIl existe une mise en œuvre officielle par Google: https://github.com/google/uuid
La génération d'un UUID version 4 fonctionne comme ceci:
Essayez-le ici: https://play.golang.org/p/6YPi1djUMj9
la source
New()
et c'est équivalent àuuid.Must(uuid.NewRandom())
rand.Reader
. Je ne sais pas si celui-ci renverrait jamais une erreur ou si cela ne peut se produire qu'avec un lecteur personnalisé ...gofrs / uuid est le remplacement de satori / go.uuid , qui est le package UUID le plus étoilé pour Go . Il prend en charge les versions 1 à 5 d'UUID et est conforme aux normes RFC 4122 et DCE 1.1.
la source
D' après le message de Russ Cox :
Remarque: dans la version originale, antérieure à Go 1, la première ligne était:
Ici, il compile et exécute, ne
/dev/urandom
renvoie que tous les zéros dans la cour de récréation. Devrait bien fonctionner localement.Dans le même fil, il y a d'autres méthodes / références / packages trouvés.
la source
import "crypto/rand"
à mon avis, mais +1 pouruuid := fmt.Sprintf("%x-%x-%x-%x-%x", b[0:4], b[4:6], b[6:8], b[8:10], b[10:])
. Combiné avec le code de l'OP, et cela fonctionne très bien.Dans le cadre de la spécification uuid, si vous générez un uuid aléatoire, il doit contenir un "4" comme 13ème caractère et un "8", "9", "a" ou "b" dans le 17ème ( source ).
la source
Le package gorand a une méthode UUID qui renvoie un UUID version 4 (généré de manière aléatoire) dans sa représentation sous forme de chaîne canonique ("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx") et il est conforme à la RFC 4122.
Il utilise également le package crypto / rand pour garantir la génération d'UUID la plus sécurisée du point de vue cryptographique sur toutes les plates-formes prises en charge par Go.
la source
Sous Linux, vous pouvez lire à partir de
/proc/sys/kernel/random/uuid
:Pas de dépendances externes!
la source
Pour Windows, j'ai fait récemment ceci:
la source
Cette bibliothèque est notre standard pour la génération et l'analyse d'uuid:
https://github.com/pborman/uuid
la source