我的代码看起来像这样:
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)
Run Code Online (Sandbox Code Playgroud)
它返回一个长度为32的字符串,但我不认为它是一个有效的UUID.如果它是一个真正的UUID,为什么它是一个UUID,什么是修改的值的代码的目的u[8]
和u[6]
.
有没有更好的方法来生成UUID?
Jam*_*dge 92
您可以使用go-uuid库生成UUID .这可以安装:
go get github.com/nu7hatch/gouuid
Run Code Online (Sandbox Code Playgroud)
您可以使用以下命令生成随机(版本4)UUID:
import "github.com/nu7hatch/gouuid"
...
u, err := uuid.NewV4()
Run Code Online (Sandbox Code Playgroud)
返回的UUID
类型是一个16字节的数组,因此您可以轻松地检索二进制值.它还通过其String()
方法提供标准的十六进制字符串表示.
你看到的代码也会生成一个有效的版本4 UUID:你在最后执行的按位操作设置UUID的版本和变量字段,以正确地将其标识为版本4.这样做是为了区分随机UUID和通过其他算法生成的UUID(例如,基于您的MAC地址和时间的版本1 UUID).
twi*_*inj 69
该go-uuid
库不符合RFC4122.变量位未正确设置.社区成员已经多次尝试将此修复,但是不接受对修复的拉取请求.
您可以使用我根据库重写的Go uuid库生成UUID go-uuid
.有几个修复和改进.这可以安装:
go get github.com/twinj/uuid
Run Code Online (Sandbox Code Playgroud)
您可以使用以下命令生成随机(版本4)UUID:
import "github.com/twinj/uuid"
u := uuid.NewV4()
Run Code Online (Sandbox Code Playgroud)
返回的UUID类型是接口,底层类型是数组.
该库还会生成v1 UUID并正确生成v3和5个UUID.有几种新方法可以帮助打印和格式化,还有一些新的通用方法可以根据现有数据创建UUID.
Ken*_*oud 47
"crypto/rand"是用于随机字节生成的跨平台pkg
package main
import (
"crypto/rand"
"fmt"
)
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
}
Run Code Online (Sandbox Code Playgroud)
stw*_*ykd 40
您应该使用google / uuid https://github.com/google/uuid
package main
import (
"fmt"
"github.com/google/uuid"
)
func main() {
id, err := uuid.NewUUID()
if err !=nil {
// handle error
}
fmt.Printf(id.String())
}
Run Code Online (Sandbox Code Playgroud)
该软件包符合RFC4122和DCE 1.1
jim*_*imt 27
u[8] = (u[8] | 0x80) & 0xBF // what's the purpose ?
u[6] = (u[6] | 0x40) & 0x4F // what's the purpose ?
Run Code Online (Sandbox Code Playgroud)
这些行将字节6和8的值钳位到特定范围.rand.Read
返回范围中的随机字节0-255
,这些字节不是UUID的所有有效值.据我所知,这应该对切片中的所有值进行.
如果你在Linux上,你也可以打电话/usr/bin/uuidgen
.
package main
import (
"fmt"
"log"
"os/exec"
)
func main() {
out, err := exec.Command("uuidgen").Output()
if err != nil {
log.Fatal(err)
}
fmt.Printf("%s", out)
}
Run Code Online (Sandbox Code Playgroud)
产量:
$ go run uuid.go
dc9076e9-2fda-4019-bd2c-900a8284b9c4
Run Code Online (Sandbox Code Playgroud)
bma*_*pin 23
gofrs/UUID是更换为顿悟/ go.uuid,这是最出演UUID包转到.它支持UUID版本1-5,并且符合RFC 4122和DCE 1.1.
import "github.com/gofrs/uuid"
// Create a Version 4 UUID, panicking on error
u := uuid.Must(uuid.NewV4())
Run Code Online (Sandbox Code Playgroud)
shu*_*fan 17
谷歌的官方实施目前正在开发中,但还不稳定:https://github.com/google/uuid
看起来这是来自这个答案的https://github.com/pborman/uuid的延续
生成版本4 UUID的工作方式如下:
__CODE__
更新:版本1.0.0已发布,有关可能不稳定的说明已被删除.
zzz*_*zzz 13
来自Russ Cox的帖子:
没有官方图书馆.忽略错误检查,这似乎可以正常工作:
f, _ := os.Open("/dev/urandom")
b := make([]byte, 16)
f.Read(b)
f.Close()
uuid := fmt.Sprintf("%x-%x-%x-%x-%x", b[0:4], b[4:6], b[6:8], b[8:10], b[10:])
Run Code Online (Sandbox Code Playgroud)
注意:在原版的Go 1版本中,第一行是:
f, _ := os.Open("/dev/urandom", os.O_RDONLY, 0)
Run Code Online (Sandbox Code Playgroud)
它在这里编译并执行,只/dev/urandom
返回操场中的所有零.应该在当地工作正常.
在同一个线程中,还有一些其他方法/引用/包.
小智 12
使用来自 google 的包随机 UUID:
package main
import (
"fmt"
"github.com/google/uuid"
)
func main() {
out := uuid.Must(uuid.NewRandom()).String()
fmt.Println(out)
}
Run Code Online (Sandbox Code Playgroud)
输出:
a1c11a53-c4be-488f-89b6-f83bf2d48dab
Run Code Online (Sandbox Code Playgroud)
作为uuid规范的一部分,如果你从随机生成一个uuid,它必须包含一个"4"作为第13个字符和一个"8","9","a"或"b"在17(源).
// this makes sure that the 13th character is "4"
u[6] = (u[6] | 0x40) & 0x4F
// this makes sure that the 17th is "8", "9", "a", or "b"
u[8] = (u[8] | 0x80) & 0xBF
Run Code Online (Sandbox Code Playgroud)
在 Linux 上,您可以阅读/proc/sys/kernel/random/uuid
:
package main
import "io/ioutil"
import "fmt"
func main() {
u, _ := ioutil.ReadFile("/proc/sys/kernel/random/uuid")
fmt.Println(string(u))
}
Run Code Online (Sandbox Code Playgroud)
没有外部依赖!
$ go run uuid.go
3ee995e3-0c96-4e30-ac1e-f7f04fd03e44
Run Code Online (Sandbox Code Playgroud)