Eu tenho um código parecido com 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)
Ele retorna uma string com comprimento de 32, mas não acho que seja um UUID válido. Se for um UUID real, por que é um UUID e qual é o propósito do código que modifica o valor de u[8]
e u[6]
.
Existe uma maneira melhor de gerar UUIDs?
Respostas:
Essas linhas prendem os valores dos bytes 6 e 8 a um intervalo específico.
rand.Read
retorna bytes aleatórios no intervalo0-255
, que nem todos são valores válidos para um UUID. Pelo que eu posso dizer, isso deve ser feito para todos os valores na fatia.Se você estiver no Linux, você pode alternativamente chamar
/usr/bin/uuidgen
.O que produz:
fonte
u[6]
eu[8]
.Você pode gerar UUIDs usando a biblioteca go-uuid . Isso pode ser instalado com:
Você pode gerar UUIDs aleatórios (versão 4) com:
O
UUID
tipo retornado é uma matriz de 16 bytes, para que você possa recuperar o valor binário facilmente. Ele também fornece a representação de string hexadecimal padrão por meio de seuString()
método.O código que você tem também parece que gerará um UUID de versão 4 válido: a manipulação bit a bit que você executa no final define os campos de versão e variante do UUID para identificá-lo corretamente como versão 4 . Isso é feito para distinguir UUIDs aleatórios daqueles gerados por outros algoritmos (por exemplo, UUIDs da versão 1 com base em seu endereço MAC e hora).
fonte
A
go-uuid
biblioteca NÃO é compatível com RFC4122. Os bits variantes não estão definidos corretamente. Houve várias tentativas de membros da comunidade para consertar isso, mas as solicitações pull para a correção não estão sendo aceitas.Você pode gerar UUIDs usando a biblioteca Go uuid que reescrevi com base na
go-uuid
biblioteca. Existem várias correções e melhorias. Isso pode ser instalado com:Você pode gerar UUIDs aleatórios (versão 4) com:
O tipo de UUID retornado é uma interface e o tipo subjacente é uma matriz.
A biblioteca também gera UUIDs v1 e gera corretamente UUIDs v3 e 5. Existem vários novos métodos para ajudar na impressão e formatação e também novos métodos gerais para criar UUIDs com base nos dados existentes.
fonte
"crypto / rand" é um pacote multiplataforma para geração aleatória de bytes
fonte
pseudo_uuid
porque está faltando os identificadores não aleatórios, como endereço MAC e tudo o mais especificado pela RFC4122? Portanto, é realmente mais aleatório.%x
tem problemas com valores de byte menores que 128, você precisa aplicar preenchimento, ou seja,%04x
para um par de bytesHá uma implementação oficial do Google: https://github.com/google/uuid
Gerar um UUID versão 4 funciona assim:
Experimente aqui: https://play.golang.org/p/6YPi1djUMj9
fonte
New()
e é equivalente auuid.Must(uuid.NewRandom())
rand.Reader
. Não tenho certeza se isso retornaria um erro ou se isso só pode acontecer com um leitor personalizado ...gofrs / uuid é o substituto de satori / go.uuid , que é o pacote UUID com mais estrela para Go . Suporta UUID versões 1-5 e é compatível com RFC 4122 e DCE 1.1.
fonte
Da postagem de Russ Cox :
Nota: Na versão original, pré Go 1, a primeira linha era:
Aqui, ele compila e executa,
/dev/urandom
retorna apenas todos os zeros no playground. Deve funcionar bem localmente.No mesmo tópico existem alguns outros métodos / referências / pacotes encontrados.
fonte
import "crypto/rand"
na minha opinião, mas 1 parauuid := fmt.Sprintf("%x-%x-%x-%x-%x", b[0:4], b[4:6], b[6:8], b[8:10], b[10:])
. Combinado com o código do OP, funciona muito bem.Como parte da especificação do uuid, se você gerar um uuid aleatoriamente, ele deverá conter um "4" como o 13º caractere e um "8", "9", "a" ou "b" no 17º ( fonte ).
fonte
O pacote gorand tem um método UUID que retorna um UUID Versão 4 (gerado aleatoriamente) em sua representação de string canônica ("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx") e é compatível com RFC 4122.
Ele também usa o pacote crypto / rand para garantir a geração mais criptograficamente segura de UUIDs em todas as plataformas suportadas pelo Go.
fonte
No Linux, você pode ler em
/proc/sys/kernel/random/uuid
:Sem dependências externas!
fonte
Para Windows, fiz recentemente o seguinte:
fonte
Esta biblioteca é nosso padrão para geração e análise de uuid:
https://github.com/pborman/uuid
fonte