Tengo un código que se parece a esto:
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)
Devuelve una cadena con una longitud de 32, pero no creo que sea un UUID válido. Si es un UUID real, ¿por qué es un UUID y cuál es el propósito del código que modifica el valor de u[8]
y u[6]
.
¿Existe una forma mejor de generar UUID?
Respuestas:
Estas líneas limitan los valores de los bytes 6 y 8 a un rango específico.
rand.Read
devuelve bytes aleatorios en el rango0-255
, que no son todos valores válidos para un UUID. Por lo que puedo decir, esto debería hacerse para todos los valores en el segmento.Si está en Linux, también puede llamar a
/usr/bin/uuidgen
.Cuyos rendimientos:
fuente
u[6]
yu[8]
.Puede generar UUID utilizando la biblioteca go-uuid . Esto se puede instalar con:
Puede generar UUID aleatorios (versión 4) con:
El
UUID
tipo devuelto es una matriz de 16 bytes, por lo que puede recuperar el valor binario fácilmente. También proporciona la representación de cadena hexadecimal estándar a través de suString()
método.El código que tiene también parece que también generará un UUID de versión 4 válido: la manipulación bit a bit que realiza al final establece la versión y los campos de variante del UUID para identificarlo correctamente como versión 4 . Esto se hace para distinguir los UUID aleatorios de los generados a través de otros algoritmos (por ejemplo, los UUID de la versión 1 basados en su dirección MAC y hora).
fuente
La
go-uuid
biblioteca NO cumple con RFC4122. Los bits de variante no están configurados correctamente. Ha habido varios intentos por parte de los miembros de la comunidad para corregir esto, pero las solicitudes de extracción para la corrección no se aceptan.Puede generar UUID utilizando la biblioteca Go uuid que reescribí en función de la
go-uuid
biblioteca. Hay varias correcciones y mejoras. Esto se puede instalar con:Puede generar UUID aleatorios (versión 4) con:
El tipo de UUID devuelto es una interfaz y el tipo subyacente es una matriz.
La biblioteca también genera UUID v1 y genera correctamente UUID v3 y 5. Hay varios métodos nuevos para ayudar con la impresión y el formateo y también nuevos métodos generales para crear UUID basados en datos existentes.
fuente
"crypto / rand" es un paquete multiplataforma para la generación de bytes aleatorios
fuente
pseudo_uuid
porque faltan los identificadores no aleatorios como la dirección MAC y cualquier otra cosa que especifique RFC4122? Entonces, en realidad, es más aleatorio.%x
tiene problemas con valores de bytes inferiores a 128, debe aplicar relleno, es decir,%04x
para un par de bytesHay una implementación oficial de Google: https://github.com/google/uuid
La generación de un UUID de la versión 4 funciona así:
Pruébelo aquí: https://play.golang.org/p/6YPi1djUMj9
fuente
New()
y es equivalente auuid.Must(uuid.NewRandom())
rand.Reader
. No estoy seguro si ese alguna vez devolvería un error o si esto solo puede suceder con un lector personalizado ...gofrs / uuid es el reemplazo de satori / go.uuid , que es el paquete UUID con más estrellas para Go . Es compatible con las versiones 1-5 de UUID y es compatible con RFC 4122 y DCE 1.1.
fuente
De la publicación de Russ Cox :
Nota: En la versión original, anterior a Go 1, la primera línea era:
Aquí se compila y ejecuta, solo
/dev/urandom
devuelve todos los ceros en el patio de recreo. Debería funcionar bien a nivel local.En el mismo hilo se encuentran algunos otros métodos / referencias / paquetes.
fuente
import "crypto/rand"
en mi opinión, pero +1 parauuid := fmt.Sprintf("%x-%x-%x-%x-%x", b[0:4], b[4:6], b[6:8], b[8:10], b[10:])
. Combinado con el código del OP, y esto funciona muy bien.Como parte de la especificación de uuid, si genera un uuid de forma aleatoria, debe contener un "4" como carácter 13 y un "8", "9", "a" o "b" en el 17 ( fuente ).
fuente
El gorand paquete tiene un método UUID que devuelve un UUID Versión 4 (generado aleatoriamente) en su representación de cadena canónica ("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx") y cumple con RFC 4122.
También utiliza el paquete crypto / rand para garantizar la generación más segura criptográficamente de UUID en todas las plataformas compatibles con Go.
fuente
En Linux, puede leer desde
/proc/sys/kernel/random/uuid
:¡Sin dependencias externas!
fuente
Para Windows, hice recientemente esto:
fuente
Esta biblioteca es nuestro estándar para la generación y el análisis de uuid:
https://github.com/pborman/uuid
fuente