53 lines
846 B
Go
53 lines
846 B
Go
package service
|
|
|
|
import (
|
|
"crypto/md5"
|
|
"crypto/rand"
|
|
"encoding/hex"
|
|
"hash"
|
|
rand2 "math/rand"
|
|
)
|
|
|
|
type UUID [16]byte
|
|
|
|
const numBytes = "1234567890"
|
|
|
|
func getUUID() (uuidHex string) {
|
|
uuid := newUUID()
|
|
uuidHex = hex.EncodeToString(uuid[:])
|
|
return
|
|
}
|
|
|
|
func randStringBytes(n int) string {
|
|
b := make([]byte, n)
|
|
for i := range b {
|
|
b[i] = numBytes[rand2.Intn(len(numBytes))]
|
|
}
|
|
return string(b)
|
|
}
|
|
|
|
func newUUID() UUID {
|
|
ns := UUID{}
|
|
safeRandom(ns[:])
|
|
u := newFromHash(md5.New(), ns, randStringBytes(16))
|
|
u[6] = (u[6] & 0x0f) | (byte(2) << 4)
|
|
u[8] = (u[8]&(0xff>>2) | (0x02 << 6))
|
|
|
|
return u
|
|
}
|
|
|
|
func newFromHash(h hash.Hash, ns UUID, name string) UUID {
|
|
u := UUID{}
|
|
h.Write(ns[:])
|
|
h.Write([]byte(name))
|
|
copy(u[:], h.Sum(nil))
|
|
|
|
return u
|
|
}
|
|
|
|
func safeRandom(dest []byte) {
|
|
if _, err := rand.Read(dest); err != nil {
|
|
panic(err)
|
|
}
|
|
}
|