This repository has been archived on 2026-06-21. You can view files and clone it, but cannot push or open issues or pull requests.
Files
MetaLab/internal/common/username.go

52 lines
1.3 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package common
import (
"crypto/rand"
"errors"
"math/big"
)
// usernameChars 随机用户名字符集(小写字母 + 数字)
const usernameChars = "abcdefghijklmnopqrstuvwxyz0123456789"
const usernameLen = 10
// UsernameChecker 用户名查重接口(避免 common 反向依赖 repository
type UsernameChecker interface {
ExistsByUsername(username string) (bool, error)
}
// GenerateUsername 生成不重复的随机 10 位用户名(小写字母 + 数字)
// checker 提供去重查询maxRetry 次重试后仍冲突则返回错误
func GenerateUsername(checker UsernameChecker, maxRetry int) (string, error) {
if maxRetry <= 0 {
maxRetry = 20
}
for i := 0; i < maxRetry; i++ {
username, err := randomUsername(usernameLen)
if err != nil {
return "", err
}
exists, err := checker.ExistsByUsername(username)
if err != nil {
return "", err
}
if !exists {
return username, nil
}
}
return "", errors.New("生成用户名失败,请重试")
}
// randomUsername 通过 crypto/rand 生成安全的随机字符串
func randomUsername(n int) (string, error) {
b := make([]byte, n)
for i := range b {
idx, err := rand.Int(rand.Reader, big.NewInt(int64(len(usernameChars))))
if err != nil {
return "", err
}
b[i] = usernameChars[idx.Int64()]
}
return string(b), nil
}