¿Existe algún método para generar un UUID con lenguaje Go?

Resuelto hardPass asked hace 11 años • 15 respuestas

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?

hardPass avatar Feb 28 '13 14:02 hardPass
Aceptado

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

shutefan avatar Nov 22 '2017 11:11 shutefan

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 UUIDtipo 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).

James Henstridge avatar Feb 28 '2013 11:02 James Henstridge

La go-uuidbiblioteca 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-uuidbiblioteca. 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.

twinj avatar Feb 17 '2014 07:02 twinj

"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
}
Ken Cloud avatar Sep 09 '2014 03:09 Ken Cloud