mh_server/lib/utils/uid.go

70 lines
1.7 KiB
Go
Raw Normal View History

2021-06-30 02:12:05 +00:00
package utils
import (
"crypto/md5"
"encoding/hex"
"fmt"
"strconv"
"time"
)
func GenUid() uint32 {
code := []string{"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
"N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"}
index := RandomNum(0, 25)
_, m, d := time.Now().Date()
month := int(m)
var monthStr string
if month >= 10 {
monthStr = SwitchMonthToHex(month)
} else {
monthStr = strconv.Itoa(month)
}
timeStr := []rune(strconv.Itoa(int(time.Now().Unix())))
timeUnixStr := []rune(strconv.Itoa(int(time.Now().UnixNano())))
randStr := fmt.Sprintf("%s%s%02d%s%s%02d", code[index], monthStr, d, string(timeStr[len(timeStr)-5:]),
string(timeUnixStr[2:7]), RandomNum(0, 99))
md := md5.New()
md.Write([]byte(randStr))
a := []rune(hex.EncodeToString(md.Sum(nil)))
s := []rune("0123456789012345678901234567890123456789")
var h string
for f := 0; f < 8; f++ {
a := ((a[f] ^ a[f+8]) - a[f]) & 0x1F
h += string(s[a])
}
id, _ := strconv.Atoi(h)
return uint32(id)
}
func SwitchMonthToHex(month int) string {
switch month {
case 10:
return "A"
case 11:
return "B"
case 12:
return "C"
default:
return "D"
}
}
//$code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
// $rand = $code[rand(0, 25)]
// . strtoupper(dechex(date('m')))
// . date('d') . substr(time(), -5)
// . substr(microtime(), 2, 5)
// . sprintf('%02d', rand(0, 99));
// for (
// $a = md5($rand, true),
// $s = '0123456789012345678901234567890123456789',
// $d = '',
// $f = 0;
// $f < 8;
// $g = ord($a[$f]),
// $d .= $s[($g ^ ord($a[$f + 8])) - $g & 0x1F],
// $f++
// );
// return $d;