@cryptotaxi247 / kubo / commits / 49f30b159

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