回答

收藏

有没有办法用go语言生成UUID

技术问答 技术问答 199 人阅读 | 0 人回复 | 2023-09-12

我有以下代码:2 P& `7 F$ ^5 H8 }: h
    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)- v; P( r0 n  L' e; O  c, Y
它返回一个长度为 32 的字符串,但我认为它不是有效的 UUID。假如是真的UUID,为什么是一个?UUID,修改值的目的是什么?u[8]和u[6]。* U* F5 ~7 z* e3 t& c" R! ~5 D6 A
是否有更好的方法生成 UUID?
, o! _7 p9 _% j$ y% R7 L                                                               
" R+ H7 q4 ?+ h- z. ]    解决方案:                                                                1 o) E' L! z4 r2 }
                                                               
    u[8] = (u[8] | 0x80) & 0xBF // what's the purpose ?u[6] = (u[6] | 0x40) & 0x4F // what's the purpose ?3 G0 _$ F6 V0 P
这些行将字节 6 和 8 的值限制在特定范围内。rand.Read返回 range 中随机字节0-这些字节不是 UUID 的所有有效值。据我所知,切片中的所有值都应该进行。) v- D* o1 y/ L0 P0 ?) z. C
若使用 linux,也可以调用/usr/bin/uuidgen.
+ J0 F8 ~. Z1 P+ @" W
    package mainimport (    "fmt"    "log"    "os/exec")func main()      out,err := exec.Command("uuidgen").Output()    if err != nil              log.Fatal(err)   }    fmt.Printf("%s",out)}
    : d5 b6 l$ {3 g6 d2 g1 G+ ~' ~0 \4 i
其中产生:& {: \5 W0 S8 u# U! G; l# B4 r. K
    $ go run uuid.go dc9076e9-2fda-4019-bd2c-900a8284b9c4
    " ~2 e- W# X$ u+ u5 t
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则