go-common/app/interface/main/creative/dao/tool/tool.go
2019-04-22 18:49:16 +08:00

124 lines
2.2 KiB
Go

package tool
import (
"crypto/md5"
"encoding/hex"
"fmt"
"math/rand"
"net/url"
"strings"
)
// Sign fn
func Sign(params url.Values) (query string, err error) {
if len(params) == 0 {
return
}
if params.Get("appkey") == "" {
err = fmt.Errorf("utils http get must have parameter appkey")
return
}
if params.Get("appsecret") == "" {
err = fmt.Errorf("utils http get must have parameter appsecret")
return
}
if params.Get("sign") != "" {
err = fmt.Errorf("utils http get must have not parameter sign")
return
}
// sign
secret := params.Get("appsecret")
params.Del("appsecret")
tmp := params.Encode()
if strings.IndexByte(tmp, '+') > -1 {
tmp = strings.Replace(tmp, "+", "%20", -1)
}
mh := md5.Sum([]byte(tmp + secret))
params.Set("sign", hex.EncodeToString(mh[:]))
query = params.Encode()
return
}
//DeDuplicationSlice for del repeat element
func DeDuplicationSlice(a []int64) (b []int64) {
if len(a) == 0 {
return
}
isHas := make(map[int64]bool)
b = make([]int64, 0)
for _, v := range a {
if ok := isHas[v]; !ok {
isHas[v] = true
b = append(b, v)
}
}
return
}
//ContainAll all element of a contain in the b.
func ContainAll(a []int64, b []int64) bool {
isHas := make(map[int64]bool)
for _, k := range b {
isHas[k] = true
}
for _, v := range a {
if !isHas[v] {
return false
}
}
return true
}
//ContainAtLeastOne fn
func ContainAtLeastOne(a []int64, b []int64) bool {
if len(a) == 0 {
return true
}
isHas := make(map[int64]bool)
for _, k := range b {
isHas[k] = true
}
for _, v := range a {
if isHas[v] {
return true
}
}
return false
}
//ElementInSlice fn
func ElementInSlice(a int64, b []int64) bool {
if len(b) == 0 {
return false
}
for _, v := range b {
if a == v {
return true
}
}
return false
}
//RandomSliceKeys for get random keys from slice by rand.
func RandomSliceKeys(start int, end int, count int, seed int64) []int {
if end < start || (end-start) < count {
return nil
}
nums := make([]int, 0)
r := rand.New(rand.NewSource(seed))
for len(nums) < count {
num := r.Intn((end - start)) + start
exist := false
for _, v := range nums {
if v == num {
exist = true
break
}
}
if !exist {
nums = append(nums, num)
}
}
return nums
}