¿Existe algún método para generar un UUID con lenguaje Go?
Tengo un código que se parece a este:
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 mejor manera de generar UUID?
Existe una implementación oficial de Google: https://github.com/google/uuid
Generar un UUID versión 4 funciona así:
package main
import (
"fmt"
"github.com/google/uuid"
)
func main() {
id := uuid.New()
fmt.Println(id.String())
}
Pruébalo aquí: https://play.golang.org/p/6YPi1djUMj9
Puede generar UUID utilizando la biblioteca go-uuid . Esto se puede instalar con:
go get github.com/nu7hatch/gouuid
Puede generar UUID aleatorios (versión 4) con:
import "github.com/nu7hatch/gouuid"
...
u, err := uuid.NewV4()
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 su String()
método.
También parece que el código que tiene generará un UUID de versión 4 válido: la manipulación bit a bit que realiza al final establece los campos de versión y variante del UUID para identificarlo correctamente como versión 4 . Esto se hace para distinguir los UUID aleatorios de los generados mediante otros algoritmos (por ejemplo, los UUID de la versión 1 basados en su dirección MAC y hora).
La go-uuid
biblioteca NO es compatible con RFC4122. Los bits de variante no están configurados correctamente. Ha habido varios intentos por parte de miembros de la comunidad para solucionar este problema, pero no se aceptan solicitudes de extracción para solucionarlo.
Puede generar UUID utilizando la biblioteca Go uuid que reescribí según la go-uuid
biblioteca. Hay varias correcciones y mejoras. Esto se puede instalar con:
go get github.com/twinj/uuid
Puede generar UUID aleatorios (versión 4) con:
import "github.com/twinj/uuid"
u := uuid.NewV4()
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.
"crypto/rand" es un paquete multiplataforma para generación de bytes aleatorios
package main
import (
"crypto/rand"
"fmt"
)
// Note - NOT RFC4122 compliant
func pseudo_uuid() (uuid string) {
b := make([]byte, 16)
_, err := rand.Read(b)
if err != nil {
fmt.Println("Error: ", err)
return
}
uuid = fmt.Sprintf("%X-%X-%X-%X-%X", b[0:4], b[4:6], b[6:8], b[8:10], b[10:])
return
}