1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- package utils
- import (
- "github.com/gofrs/uuid/v5"
- "github.com/metacubex/randv2"
- )
- type unsafeRandReader struct{}
- func (r unsafeRandReader) Read(p []byte) (n int, err error) {
- // modify from https://github.com/golang/go/blob/587c3847da81aa7cfc3b3db2677c8586c94df13a/src/runtime/rand.go#L70-L89
- // Inspired by wyrand.
- n = len(p)
- v := randv2.Uint64()
- for len(p) > 0 {
- v ^= 0xa0761d6478bd642f
- v *= 0xe7037ed1a0b428db
- size := 8
- if len(p) < 8 {
- size = len(p)
- }
- for i := 0; i < size; i++ {
- p[i] ^= byte(v >> (8 * i))
- }
- p = p[size:]
- v = v>>32 | v<<32
- }
- return
- }
- var UnsafeRandReader = unsafeRandReader{}
- var UnsafeUUIDGenerator = uuid.NewGenWithOptions(uuid.WithRandomReader(UnsafeRandReader))
- func NewUUIDV1() uuid.UUID {
- u, _ := UnsafeUUIDGenerator.NewV1() // unsafeRandReader wouldn't cause error, so ignore err is safe
- return u
- }
- func NewUUIDV3(ns uuid.UUID, name string) uuid.UUID {
- return UnsafeUUIDGenerator.NewV3(ns, name)
- }
- func NewUUIDV4() uuid.UUID {
- u, _ := UnsafeUUIDGenerator.NewV4() // unsafeRandReader wouldn't cause error, so ignore err is safe
- return u
- }
- func NewUUIDV5(ns uuid.UUID, name string) uuid.UUID {
- return UnsafeUUIDGenerator.NewV5(ns, name)
- }
- func NewUUIDV6() uuid.UUID {
- u, _ := UnsafeUUIDGenerator.NewV6() // unsafeRandReader wouldn't cause error, so ignore err is safe
- return u
- }
- func NewUUIDV7() uuid.UUID {
- u, _ := UnsafeUUIDGenerator.NewV7() // unsafeRandReader wouldn't cause error, so ignore err is safe
- return u
- }
- // UUIDMap https://github.com/XTLS/Xray-core/issues/158#issue-783294090
- func UUIDMap(str string) (uuid.UUID, error) {
- u, err := uuid.FromString(str)
- if err != nil {
- return NewUUIDV5(uuid.Nil, str), nil
- }
- return u, nil
- }
|