comparison pkg/common/random.go @ 414:c1047fd04a3a

Moved project specific Go packages to new pkg folder.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Wed, 15 Aug 2018 17:30:50 +0200
parents common/random.go@ac23905e64b1
children a244b18cb916
comparison
equal deleted inserted replaced
413:a9440a4826aa 414:c1047fd04a3a
1 package common
2
3 import (
4 "bytes"
5 "crypto/rand"
6 "io"
7 "log"
8 "math/big"
9 )
10
11 func GenerateRandomKey(length int) []byte {
12 k := make([]byte, length)
13 if _, err := io.ReadFull(rand.Reader, k); err != nil {
14 return nil
15 }
16 return k
17 }
18
19 func RandomString(n int) string {
20
21 const (
22 special = "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~"
23 alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
24 "abcdefghijklmnopqrstuvwxyz" +
25 "0123456789" +
26 special
27 )
28
29 max := big.NewInt(int64(len(alphabet)))
30 out := make([]byte, n)
31
32 for i := 0; i < 1000; i++ {
33 for i := range out {
34 v, err := rand.Int(rand.Reader, max)
35 if err != nil {
36 log.Panicf("error: %v\n", err)
37 }
38 out[i] = alphabet[v.Int64()]
39 }
40 // Ensure at least one special char.
41 if bytes.IndexAny(out, special) >= 0 {
42 return string(out)
43 }
44 }
45 log.Println("warn: Your random generator may be broken.")
46 out[0] = special[0]
47 return string(out)
48 }