63 lines
1.6 KiB
Go
63 lines
1.6 KiB
Go
package utils
|
||
|
||
import (
|
||
"crypto/md5"
|
||
"fmt"
|
||
"math/rand"
|
||
"time"
|
||
)
|
||
|
||
const charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
|
||
|
||
// GenerateInviteCode 生成邀请码,基于用户ID和随机数的MD5哈希
|
||
func GenerateInviteCode(userID uint) string {
|
||
rand.Seed(time.Now().UnixNano())
|
||
// 拼接用户ID和随机数
|
||
data := fmt.Sprintf("%d%d", userID, rand.Intn(1000000))
|
||
hash := md5.Sum([]byte(data))
|
||
code := ""
|
||
for i := 0; i < 6; i++ {
|
||
// 取哈希的前6位,每位映射到字符集
|
||
code += string(charset[int(hash[i])%len(charset)])
|
||
}
|
||
return code
|
||
}
|
||
|
||
func GenerateRandomString(length int) string {
|
||
rand.Seed(time.Now().UnixNano())
|
||
// 拼接用户ID和随机数
|
||
data := fmt.Sprintf("%d%d", 6, rand.Intn(1000000))
|
||
hash := md5.Sum([]byte(data))
|
||
code := ""
|
||
for i := 0; i < 12; i++ {
|
||
// 取哈希的前6位,每位映射到字符集
|
||
code += string(charset[int(hash[i])%len(charset)])
|
||
}
|
||
return code
|
||
}
|
||
|
||
// GenerateRedeemCode 生成单个兑换码,格式为N7DY4kcf5z37hwz,随机大小写字母+数字
|
||
func GenerateRedeemCode() string {
|
||
const codeCharset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
|
||
codeLen := 15
|
||
b := make([]byte, codeLen)
|
||
for i := range b {
|
||
b[i] = codeCharset[rand.Intn(len(codeCharset))]
|
||
}
|
||
return string(b)
|
||
}
|
||
|
||
// GenerateRedeemCodes 批量生成唯一兑换码,number为生成数量
|
||
func GenerateRedeemCodes(number int) []string {
|
||
codesMap := make(map[string]struct{}, number)
|
||
for len(codesMap) < number {
|
||
code := GenerateRedeemCode()
|
||
codesMap[code] = struct{}{}
|
||
}
|
||
codes := make([]string, 0, number)
|
||
for code := range codesMap {
|
||
codes = append(codes, code)
|
||
}
|
||
return codes
|
||
}
|