如何从 UUID 中获取两个长数字?

huangapple go评论117阅读模式
英文:

How can I get 2 long numbers from a uuid?

问题

你可以使用以下方法从生成的 UUID 中获取两个长整型数:

  1. 将生成的 UUID 转换为字符串形式。
  2. 使用字符串分割函数将 UUID 字符串分割为两部分。
  3. 将每个部分转换为长整型数。

以下是一个示例代码片段,演示如何实现这一过程:

  1. package main
  2. import (
  3. "fmt"
  4. "strings"
  5. "github.com/satori/go.uuid"
  6. )
  7. func main() {
  8. // 生成 UUID
  9. uuid := uuid.NewV4()
  10. // 将 UUID 转换为字符串
  11. uuidStr := uuid.String()
  12. // 使用字符串分割函数将 UUID 字符串分割为两部分
  13. parts := strings.Split(uuidStr, "-")
  14. // 将每个部分转换为长整型数
  15. part1 := convertToLongInt(parts[0])
  16. part2 := convertToLongInt(parts[1])
  17. fmt.Println(part1, part2)
  18. }
  19. func convertToLongInt(str string) int64 {
  20. var result int64
  21. _, err := fmt.Sscanf(str, "%x", &result)
  22. if err != nil {
  23. // 错误处理
  24. }
  25. return result
  26. }

请注意,此示例假设您已经安装了 github.com/satori/go.uuid 库,并且已经导入了所需的包。

英文:

I'm using this library to generate a v4 uuid:

https://github.com/satori/go.uuid

What is the most efficient way to get 2 long ints from the generated uuid?

答案1

得分: 3

你可以使用Bytes()函数获取字节,然后使用encoding/binary将其转换为长整型。正如@icza所提到的,你还可以直接对UUID对象进行切片,这样你甚至不需要调用Bytes()函数。

  1. package main
  2. import "fmt"
  3. import "encoding/binary"
  4. import "github.com/satori/go.uuid"
  5. func main() {
  6. u1 := uuid.NewV4()
  7. fmt.Printf("UUIDv4: %s\n", u1)
  8. l1 := binary.BigEndian.Uint64(u1[:8])
  9. l2 := binary.BigEndian.Uint64(u1[8:])
  10. fmt.Printf("%x %x\n", l1, l2)
  11. fmt.Printf("%v %v\n", l1, l2)
  12. }
英文:

You can use the Bytes() function to get the bytes and then convert to a long with encoding/binary. As @icza mentioned, you can also slice the UUID object directly, so you don't even need to call Bytes().

  1. package main
  2. import "fmt"
  3. import "encoding/binary"
  4. import "github.com/satori/go.uuid"
  5. func main() {
  6. u1 := uuid.NewV4()
  7. fmt.Printf("UUIDv4: %s\n", u1)
  8. l1 := binary.BigEndian.Uint64(u1[:8])
  9. l2 := binary.BigEndian.Uint64(u1[8:])
  10. fmt.Printf("%x %x\n", l1, l2)
  11. fmt.Printf("%v %v\n", l1, l2)
  12. }

答案2

得分: 1

例如,

  1. package main
  2. import (
  3. "encoding/binary"
  4. "fmt"
  5. "github.com/satori/go.uuid"
  6. )
  7. func main() {
  8. u := uuid.NewV4()
  9. fmt.Printf("%s\n", u)
  10. u1 := binary.BigEndian.Uint64(u[0:8])
  11. u2 := binary.BigEndian.Uint64(u[8:16])
  12. fmt.Printf("%x %x\n", u1, u2)
  13. }

输出:

  1. eb33dcfa-e439-4ff9-b366-bcd397e0852f
  2. eb33dcfae4394ff9 b366bcd397e0852f
英文:

For example,

  1. package main
  2. import (
  3. "encoding/binary"
  4. "fmt"
  5. "github.com/satori/go.uuid"
  6. )
  7. func main() {
  8. u := uuid.NewV4()
  9. fmt.Printf("%s\n", u)
  10. u1 := binary.BigEndian.Uint64(u[0:8])
  11. u2 := binary.BigEndian.Uint64(u[8:16])
  12. fmt.Printf("%x %x\n", u1, u2)
  13. }

Output:

  1. eb33dcfa-e439-4ff9-b366-bcd397e0852f
  2. eb33dcfae4394ff9 b366bcd397e0852f

huangapple
  • 本文由 发表于 2016年2月2日 04:27:32
  • 转载请务必保留本文链接:https://go.coder-hub.com/35139682.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定