added random to godeps
Juan Batiz-Benet committed
Nov 8, 2014 at 18:45 UTC
49f30b159775c9f43f832762c21607f2a3a1db11
4 files changed
+198
Godeps/Godeps.json
+4
@@ -110,6 +110,10 @@
110
"Comment": "0.1.0-5-g1976046",
111
"Rev": "1976046c2b0db0b668791b3e541d76a38b7c1af7"
112
},
113
+ {
114
+ "ImportPath": "github.com/jbenet/go-random/random",
115
+ "Rev": "623fff67b06299c43b5542d42c427c7c2855a362"
116
+ },
117
{
118
"ImportPath": "github.com/kr/binarydist",
119
"Rev": "9955b0ab8708602d411341e55fffd7e0700f86bd"
Godeps/_workspace/src/github.com/jbenet/go-random/random/random.go
new
+88
@@ -0,0 +1,88 @@
1
+package main
2
+
3
+import (
4
+ "bytes"
5
+ randcrypto "crypto/rand"
6
+ "fmt"
7
+ "io"
8
+ randmath "math/rand"
9
+ "os"
10
+ "strconv"
11
+)
12
+
13
+func main() {
14
+ l := len(os.Args)
15
+ if l != 2 && l != 3 {
16
+ usageError()
17
+ }
18
+
19
+ count, err := strconv.ParseInt(os.Args[1], 10, 64)
20
+ if err != nil {
21
+ usageError()
22
+ }
23
+
24
+ if l == 2 {
25
+ err = writeRandomBytes(count, os.Stdout)
26
+ } else {
27
+ seed, err2 := strconv.ParseInt(os.Args[2], 10, 64)
28
+ if err2 != nil {
29
+ usageError()
30
+ }
31
+ err = writePseudoRandomBytes(count, os.Stdout, seed)
32
+ }
33
+
34
+ if err != nil {
35
+ die(err)
36
+ }
37
+}
38
+
39
+func usageError() {
40
+ fmt.Fprintf(os.Stderr, "Usage: %s <count> [<seed>]\n", os.Args[0])
41
+ fmt.Fprintf(os.Stderr, "If <seed> is given, output <count> pseudo random bytes made from <seed> (from Go's math/rand)\n")
42
+ fmt.Fprintf(os.Stderr, "Otherwise, output <count> random bytes (from Go's crypto/rand)\n")
43
+ os.Exit(-1)
44
+}
45
+
46
+func die(err error) {
47
+ fmt.Fprintf(os.Stderr, "Error: %v", err)
48
+ os.Exit(-1)
49
+}
50
+
51
+func writeRandomBytes(count int64, w io.Writer) error {
52
+ r := &io.LimitedReader{R: randcrypto.Reader, N: count}
53
+ _, err := io.Copy(w, r)
54
+ return err
55
+}
56
+
57
+func writePseudoRandomBytes(count int64, w io.Writer, seed int64) error {
58
+ randmath.Seed(seed)
59
+
60
+ // Configurable buffer size
61
+ bufsize := int64(1024 * 1024 * 4)
62
+ b := make([]byte, bufsize)
63
+
64
+ for count > 0 {
65
+ if bufsize > count {
66
+ bufsize = count
67
+ b = b[:bufsize]
68
+ }
69
+
70
+ var n int64
71
+ for i := int64(0); i < bufsize; i++ {
72
+ n = randmath.Int63()
73
+ for j := 0; j < 8 && i < bufsize; j++ {
74
+ b[i] = byte(n & 0xff)
75
+ n >>= 8
76
+ i++
77
+ }
78
+ }
79
+ count = count - bufsize
80
+
81
+ r := bytes.NewReader(b)
82
+ _, err := io.Copy(w, r)
83
+ if err != nil {
84
+ return err
85
+ }
86
+ }
87
+ return nil
88
+}
Godeps/_workspace/src/github.com/jbenet/go-random/random/random_test.go
new
+96
@@ -0,0 +1,96 @@
1
+package main
2
+
3
+import (
4
+ "bytes"
5
+ "io/ioutil"
6
+ "testing"
7
+ "time"
8
+)
9
+
10
+func TestPseudoRandom(t *testing.T) {
11
+
12
+ var testCases = []int{
13
+ 1024,
14
+ 187654,
15
+ 1048576,
16
+ 4932132,
17
+ }
18
+
19
+ for _, size := range testCases {
20
+ var buf bytes.Buffer
21
+ err := writePseudoRandomBytes(int64(size), &buf, int64(time.Now().UnixNano()))
22
+ if err != nil {
23
+ t.Fatal(err)
24
+ }
25
+
26
+ if buf.Len() != size {
27
+ t.Fatal("buffer not of the right size: %d != %d", buf.Len(), size)
28
+ }
29
+ }
30
+}
31
+
32
+func TestPseudoRandomSeed(t *testing.T) {
33
+
34
+ var first []byte
35
+ var size = int64(1024 * 4)
36
+ seed := time.Now().UnixNano()
37
+
38
+ for i := 0; i < 100; i++ {
39
+ var bufs bytes.Buffer
40
+ var bufr bytes.Buffer
41
+
42
+ if err := writePseudoRandomBytes(size, &bufs, seed); err != nil {
43
+ t.Fatal(err)
44
+ }
45
+
46
+ if err := writePseudoRandomBytes(size, &bufr, time.Now().UnixNano()); err != nil {
47
+ t.Fatal(err)
48
+ }
49
+
50
+ if bufs.Len() != int(size) {
51
+ t.Fatal("buffer not of the right size: %d != %d", bufs.Len(), size)
52
+ }
53
+ if bufr.Len() != int(size) {
54
+ t.Fatal("buffer not of the right size: %d != %d", bufr.Len(), size)
55
+ }
56
+
57
+ if first == nil {
58
+ first = bufs.Bytes()
59
+ } else if !bytes.Equal(first, bufs.Bytes()) {
60
+ t.Fatal("seeded constructed different bytes")
61
+ }
62
+
63
+ if bytes.Equal(first, bufr.Bytes()) {
64
+ t.Fatal("non-seeded constructed same bytes")
65
+ }
66
+ }
67
+}
68
+
69
+func TestCryptoRandom(t *testing.T) {
70
+
71
+ var testCases = []int{
72
+ 1024,
73
+ 187654,
74
+ 1048576,
75
+ }
76
+
77
+ for _, size := range testCases {
78
+ var buf bytes.Buffer
79
+ err := writeRandomBytes(int64(size), &buf)
80
+ if err != nil {
81
+ t.Fatal(err)
82
+ }
83
+
84
+ if buf.Len() != size {
85
+ t.Fatal("buffer not of the right size: %d != %d", buf.Len(), size)
86
+ }
87
+ }
88
+}
89
+
90
+func BenchmarkCryptoRandom(b *testing.B) {
91
+ writeRandomBytes(int64(b.N), ioutil.Discard)
92
+}
93
+
94
+func BenchmarkPseudoRandom(b *testing.B) {
95
+ writePseudoRandomBytes(int64(b.N), ioutil.Discard, time.Now().UnixNano())
96
+}
test/random-dep.go
new
+10
@@ -0,0 +1,10 @@
1
+// package randomdep is here to introduce a dependency in random for godep to
2
+// function properly. this way we can keep go-random vendored and not
3
+// accidentally break our tests when we change it.
4
+package randomdep
5
+
6
+import (
7
+ random "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-random/random"
8
+)
9
+
10
+var _ = random