Skip to content

Commit e013ce5

Browse files
committed
修改随机数获取策略
1 parent 58060ab commit e013ce5

File tree

1 file changed

+18
-2
lines changed

1 file changed

+18
-2
lines changed

main.go

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@ type redisPoolConf struct {
3030
}
3131

3232
const letterBytes = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
33+
const (
34+
letterIdxBits = 6 // 6 bits to represent a letter index
35+
letterIdxMask = 1<<letterIdxBits - 1 // All 1-bits, as many as letterIdxBits
36+
letterIdxMax = 63 / letterIdxBits // # of letter indices fitting in 63 bits
37+
)
3338

3439
const defaultPort int = 8002
3540
const defaultExpire = 90
@@ -160,9 +165,20 @@ func longToShort(longUrl string, ttl int) string {
160165
// 产生一个63位随机整数,除以字符数取余获取对应字符
161166
func generate(bits int) string {
162167
b := make([]byte, bits)
163-
for i := range b {
164-
b[i] = letterBytes[rand.Int63()%int64(len(letterBytes))]
168+
169+
// A rand.Int63() generates 63 random bits, enough for letterIdxMax letters!
170+
for i, cache, remain := bits-1, rand.Int63(), letterIdxMax; i >= 0; {
171+
if remain == 0 {
172+
cache, remain = rand.Int63(), letterIdxMax
173+
}
174+
if idx := int(cache & letterIdxMask); idx < len(letterBytes) {
175+
b[i] = letterBytes[idx]
176+
i--
177+
}
178+
cache >>= letterIdxBits
179+
remain--
165180
}
181+
166182
return string(b)
167183
}
168184

0 commit comments

Comments
 (0)