tool.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. package tool
  2. import (
  3. "crypto/md5"
  4. "encoding/hex"
  5. "fmt"
  6. "math/rand"
  7. "net/url"
  8. "strings"
  9. )
  10. // Sign fn
  11. func Sign(params url.Values) (query string, err error) {
  12. if len(params) == 0 {
  13. return
  14. }
  15. if params.Get("appkey") == "" {
  16. err = fmt.Errorf("utils http get must have parameter appkey")
  17. return
  18. }
  19. if params.Get("appsecret") == "" {
  20. err = fmt.Errorf("utils http get must have parameter appsecret")
  21. return
  22. }
  23. if params.Get("sign") != "" {
  24. err = fmt.Errorf("utils http get must have not parameter sign")
  25. return
  26. }
  27. // sign
  28. secret := params.Get("appsecret")
  29. params.Del("appsecret")
  30. tmp := params.Encode()
  31. if strings.IndexByte(tmp, '+') > -1 {
  32. tmp = strings.Replace(tmp, "+", "%20", -1)
  33. }
  34. mh := md5.Sum([]byte(tmp + secret))
  35. params.Set("sign", hex.EncodeToString(mh[:]))
  36. query = params.Encode()
  37. return
  38. }
  39. //DeDuplicationSlice for del repeat element
  40. func DeDuplicationSlice(a []int64) (b []int64) {
  41. if len(a) == 0 {
  42. return
  43. }
  44. isHas := make(map[int64]bool)
  45. b = make([]int64, 0)
  46. for _, v := range a {
  47. if ok := isHas[v]; !ok {
  48. isHas[v] = true
  49. b = append(b, v)
  50. }
  51. }
  52. return
  53. }
  54. //ContainAll all element of a contain in the b.
  55. func ContainAll(a []int64, b []int64) bool {
  56. isHas := make(map[int64]bool)
  57. for _, k := range b {
  58. isHas[k] = true
  59. }
  60. for _, v := range a {
  61. if !isHas[v] {
  62. return false
  63. }
  64. }
  65. return true
  66. }
  67. //ContainAtLeastOne fn
  68. func ContainAtLeastOne(a []int64, b []int64) bool {
  69. if len(a) == 0 {
  70. return true
  71. }
  72. isHas := make(map[int64]bool)
  73. for _, k := range b {
  74. isHas[k] = true
  75. }
  76. for _, v := range a {
  77. if isHas[v] {
  78. return true
  79. }
  80. }
  81. return false
  82. }
  83. //ElementInSlice fn
  84. func ElementInSlice(a int64, b []int64) bool {
  85. if len(b) == 0 {
  86. return false
  87. }
  88. for _, v := range b {
  89. if a == v {
  90. return true
  91. }
  92. }
  93. return false
  94. }
  95. //RandomSliceKeys for get random keys from slice by rand.
  96. func RandomSliceKeys(start int, end int, count int, seed int64) []int {
  97. if end < start || (end-start) < count {
  98. return nil
  99. }
  100. nums := make([]int, 0)
  101. r := rand.New(rand.NewSource(seed))
  102. for len(nums) < count {
  103. num := r.Intn((end - start)) + start
  104. exist := false
  105. for _, v := range nums {
  106. if v == num {
  107. exist = true
  108. break
  109. }
  110. }
  111. if !exist {
  112. nums = append(nums, num)
  113. }
  114. }
  115. return nums
  116. }