From c3a23b28ee030fa8a43a683023fb09f7ab79c74e Mon Sep 17 00:00:00 2001 From: astaxie Date: Tue, 27 May 2014 15:29:43 +0800 Subject: [PATCH] beego: improve the RandomCreateBytes #620 when rand.Read is failed. will use the math/rand to generate the rand bytes --- utils/rand.go | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/utils/rand.go b/utils/rand.go index d9629e60..363f41b7 100644 --- a/utils/rand.go +++ b/utils/rand.go @@ -8,18 +8,32 @@ package utils import ( "crypto/rand" + r "math/rand" + "time" ) // RandomCreateBytes generate random []byte by specify chars. func RandomCreateBytes(n int, alphabets ...byte) []byte { const alphanum = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" var bytes = make([]byte, n) - rand.Read(bytes) + var randby bool + if num, err := rand.Read(bytes); num != n || err != nil { + r.Seed(time.Now().UnixNano()) + randby = true + } for i, b := range bytes { if len(alphabets) == 0 { - bytes[i] = alphanum[b%byte(len(alphanum))] + if randby { + bytes[i] = alphanum[r.Intn(len(alphanum))] + } else { + bytes[i] = alphanum[b%byte(len(alphanum))] + } } else { - bytes[i] = alphabets[b%byte(len(alphabets))] + if randby { + bytes[i] = alphabets[r.Intn(len(alphabets))] + } else { + bytes[i] = alphabets[b%byte(len(alphabets))] + } } } return bytes