util.go 846 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. package service
  2. import (
  3. "crypto/md5"
  4. "crypto/rand"
  5. "encoding/hex"
  6. "hash"
  7. rand2 "math/rand"
  8. )
  9. type UUID [16]byte
  10. const numBytes = "1234567890"
  11. func getUUID() (uuidHex string) {
  12. uuid := newUUID()
  13. uuidHex = hex.EncodeToString(uuid[:])
  14. return
  15. }
  16. func randStringBytes(n int) string {
  17. b := make([]byte, n)
  18. for i := range b {
  19. b[i] = numBytes[rand2.Intn(len(numBytes))]
  20. }
  21. return string(b)
  22. }
  23. func newUUID() UUID {
  24. ns := UUID{}
  25. safeRandom(ns[:])
  26. u := newFromHash(md5.New(), ns, randStringBytes(16))
  27. u[6] = (u[6] & 0x0f) | (byte(2) << 4)
  28. u[8] = (u[8]&(0xff>>2) | (0x02 << 6))
  29. return u
  30. }
  31. func newFromHash(h hash.Hash, ns UUID, name string) UUID {
  32. u := UUID{}
  33. h.Write(ns[:])
  34. h.Write([]byte(name))
  35. copy(u[:], h.Sum(nil))
  36. return u
  37. }
  38. func safeRandom(dest []byte) {
  39. if _, err := rand.Read(dest); err != nil {
  40. panic(err)
  41. }
  42. }