mirror of
https://github.com/safing/portbase
synced 2025-04-19 08:59:09 +00:00
45 lines
1.2 KiB
Go
45 lines
1.2 KiB
Go
package utils
|
|
|
|
import (
|
|
"encoding/binary"
|
|
"time"
|
|
|
|
"github.com/gofrs/uuid"
|
|
)
|
|
|
|
var (
|
|
constantUUID = uuid.Must(uuid.FromString("e8dba9f7-21e2-4c82-96cb-6586922c6422"))
|
|
instanceUUID = RandomUUID("instance")
|
|
)
|
|
|
|
// RandomUUID returns a new random UUID with optionally provided ns.
|
|
func RandomUUID(ns string) uuid.UUID {
|
|
randUUID, err := uuid.NewV4()
|
|
switch {
|
|
case err != nil:
|
|
// fallback
|
|
// should practically never happen
|
|
return uuid.NewV5(uuidFromTime(), ns)
|
|
case ns != "":
|
|
// mix ns into the UUID
|
|
return uuid.NewV5(randUUID, ns)
|
|
default:
|
|
return randUUID
|
|
}
|
|
}
|
|
|
|
// DerivedUUID returns a new UUID that is derived from the input only, and therefore is always reproducible.
|
|
func DerivedUUID(input string) uuid.UUID {
|
|
return uuid.NewV5(constantUUID, input)
|
|
}
|
|
|
|
// DerivedInstanceUUID returns a new UUID that is derived from the input, but is unique per instance (execution) and therefore is only reproducible with the same process.
|
|
func DerivedInstanceUUID(input string) uuid.UUID {
|
|
return uuid.NewV5(instanceUUID, input)
|
|
}
|
|
|
|
func uuidFromTime() uuid.UUID {
|
|
var timeUUID uuid.UUID
|
|
binary.LittleEndian.PutUint64(timeUUID[:], uint64(time.Now().UnixNano()))
|
|
return timeUUID
|
|
}
|