uuid.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package utils
  2. import (
  3. "github.com/gofrs/uuid/v5"
  4. "github.com/metacubex/randv2"
  5. )
  6. type unsafeRandReader struct{}
  7. func (r unsafeRandReader) Read(p []byte) (n int, err error) {
  8. // modify from https://github.com/golang/go/blob/587c3847da81aa7cfc3b3db2677c8586c94df13a/src/runtime/rand.go#L70-L89
  9. // Inspired by wyrand.
  10. n = len(p)
  11. v := randv2.Uint64()
  12. for len(p) > 0 {
  13. v ^= 0xa0761d6478bd642f
  14. v *= 0xe7037ed1a0b428db
  15. size := 8
  16. if len(p) < 8 {
  17. size = len(p)
  18. }
  19. for i := 0; i < size; i++ {
  20. p[i] ^= byte(v >> (8 * i))
  21. }
  22. p = p[size:]
  23. v = v>>32 | v<<32
  24. }
  25. return
  26. }
  27. var UnsafeRandReader = unsafeRandReader{}
  28. var UnsafeUUIDGenerator = uuid.NewGenWithOptions(uuid.WithRandomReader(UnsafeRandReader))
  29. func NewUUIDV1() uuid.UUID {
  30. u, _ := UnsafeUUIDGenerator.NewV1() // unsafeRandReader wouldn't cause error, so ignore err is safe
  31. return u
  32. }
  33. func NewUUIDV3(ns uuid.UUID, name string) uuid.UUID {
  34. return UnsafeUUIDGenerator.NewV3(ns, name)
  35. }
  36. func NewUUIDV4() uuid.UUID {
  37. u, _ := UnsafeUUIDGenerator.NewV4() // unsafeRandReader wouldn't cause error, so ignore err is safe
  38. return u
  39. }
  40. func NewUUIDV5(ns uuid.UUID, name string) uuid.UUID {
  41. return UnsafeUUIDGenerator.NewV5(ns, name)
  42. }
  43. func NewUUIDV6() uuid.UUID {
  44. u, _ := UnsafeUUIDGenerator.NewV6() // unsafeRandReader wouldn't cause error, so ignore err is safe
  45. return u
  46. }
  47. func NewUUIDV7() uuid.UUID {
  48. u, _ := UnsafeUUIDGenerator.NewV7() // unsafeRandReader wouldn't cause error, so ignore err is safe
  49. return u
  50. }
  51. // UUIDMap https://github.com/XTLS/Xray-core/issues/158#issue-783294090
  52. func UUIDMap(str string) (uuid.UUID, error) {
  53. u, err := uuid.FromString(str)
  54. if err != nil {
  55. return NewUUIDV5(uuid.Nil, str), nil
  56. }
  57. return u, nil
  58. }