77 lines
2.1 KiB
Go
77 lines
2.1 KiB
Go
package utils
|
|
|
|
import (
|
|
"crypto/rand"
|
|
"encoding/base64"
|
|
"math/big"
|
|
"time"
|
|
)
|
|
|
|
const (
|
|
// 字符集
|
|
alphanumeric = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
|
|
letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
|
numbers = "0123456789"
|
|
)
|
|
|
|
// GenerateRandomString 生成指定长度的随机字符串
|
|
func GenerateRandomString(length int) string {
|
|
return generateRandomFromCharset(length, alphanumeric)
|
|
}
|
|
|
|
// GenerateRandomLetters 生成指定长度的随机字母字符串
|
|
func GenerateRandomLetters(length int) string {
|
|
return generateRandomFromCharset(length, letters)
|
|
}
|
|
|
|
// GenerateRandomNumbers 生成指定长度的随机数字字符串
|
|
func GenerateRandomNumbers(length int) string {
|
|
return generateRandomFromCharset(length, numbers)
|
|
}
|
|
|
|
// generateRandomFromCharset 从指定字符集生成随机字符串
|
|
func generateRandomFromCharset(length int, charset string) string {
|
|
result := make([]byte, length)
|
|
charsetLen := big.NewInt(int64(len(charset)))
|
|
|
|
for i := 0; i < length; i++ {
|
|
randomIndex, err := rand.Int(rand.Reader, charsetLen)
|
|
if err != nil {
|
|
// 如果加密随机数生成失败,回退到时间种子
|
|
return generateRandomFallback(length, charset)
|
|
}
|
|
result[i] = charset[randomIndex.Int64()]
|
|
}
|
|
|
|
return string(result)
|
|
}
|
|
|
|
// generateRandomFallback 回退的随机生成方法
|
|
func generateRandomFallback(length int, charset string) string {
|
|
// 使用时间作为种子的简单随机生成
|
|
seed := time.Now().UnixNano()
|
|
result := make([]byte, length)
|
|
|
|
for i := 0; i < length; i++ {
|
|
seed = seed*1103515245 + 12345
|
|
result[i] = charset[(seed/65536)%int64(len(charset))]
|
|
}
|
|
|
|
return string(result)
|
|
}
|
|
|
|
// GenerateSecureToken 生成安全令牌
|
|
func GenerateSecureToken(length int) (string, error) {
|
|
bytes := make([]byte, length)
|
|
if _, err := rand.Read(bytes); err != nil {
|
|
return "", err
|
|
}
|
|
return base64.URLEncoding.EncodeToString(bytes), nil
|
|
}
|
|
|
|
// GenerateID 生成唯一ID
|
|
func GenerateID() string {
|
|
timestamp := time.Now().UnixNano()
|
|
random := GenerateRandomString(8)
|
|
return base64.URLEncoding.EncodeToString([]byte(string(timestamp) + random))[:16]
|
|
} |