package util
|
|
import (
|
"crypto/hmac"
|
"crypto/md5"
|
"crypto/sha256"
|
"encoding/base64"
|
"encoding/hex"
|
"fmt"
|
"math/rand"
|
"strconv"
|
"strings"
|
"time"
|
"unsafe"
|
)
|
|
func Sha256(message string) string {
|
h := sha256.New()
|
h.Write([]byte(message))
|
res := h.Sum(nil)
|
return hex.EncodeToString(res)
|
}
|
|
func ComputeHmacSha256Base64(message string, secret string) string {
|
key := []byte(secret)
|
h := hmac.New(sha256.New, key)
|
h.Write([]byte(message))
|
abs := h.Sum(nil)
|
return base64.StdEncoding.EncodeToString(abs)
|
}
|
|
|
func Hik_ComputeSignatureBase64(appKey string, appSecret string, httpMethod string, accept string, contentType string, date string, url string) string {
|
httpHeaders := httpMethod +"\n" + accept + "\n" + contentType + "\n"+ date +"\n"
|
customHeaders := "x-ca-key:"+ appKey +"\n"
|
msg := httpHeaders + customHeaders + url
|
return ComputeHmacSha256Base64(msg, appSecret)
|
}
|
|
type SliceMock struct {
|
addr uintptr
|
len int
|
cap int
|
}
|
|
func GetIBytes(v interface{}) []byte {
|
len := unsafe.Sizeof(v)
|
dataBytes := &SliceMock{
|
addr: uintptr(unsafe.Pointer(&v)),
|
cap: int(len),
|
len: int(len),
|
}
|
b := *(*[]byte)(unsafe.Pointer(dataBytes))
|
return b
|
}
|
|
func MD5Base64(s []byte) string {
|
sum := md5.Sum(s)
|
return base64.StdEncoding.EncodeToString(sum[:])
|
}
|
|
func GenValidateCode(width int) string {
|
numeric := [10]byte{0,1,2,3,4,5,6,7,8,9}
|
r := len(numeric)
|
rand.Seed(time.Now().UnixNano())
|
|
var sb strings.Builder
|
for i := 0; i < width; i++ {
|
fmt.Fprintf(&sb, "%d", numeric[ rand.Intn(r) ])
|
}
|
str := sb.String()
|
if strings.HasPrefix(str, "0") {
|
pI := RandInt(1,9)
|
str = strconv.Itoa(pI) + str[1:]
|
}
|
return str
|
}
|
|
//生成区间随机数
|
func RandInt(min, max int) int {
|
if min >= max || min ==0 ||max == 0 {
|
return max
|
}
|
return rand.Intn(max-min) + min
|
}
|