views:

144

answers:

1

Could put a little example about the use of crypto/rand [1]?

The function Read has as parameter an array of bytes. Why? If it access to /dev/urandom to get the random data.

func Read(b []byte) (n int, err os.Error)

[1] http://golang.org/pkg/crypto/rand/

+2  A: 
func Read(b []byte) (n int, err os.Error)

Read is a helper function that calls Reader.Read. Reader is defined as: var Reader io.Reader.

crypto/rand/

io.Reader is the interface that wraps the basic Read method.

Read reads up to len(p) bytes into p. It returns the number of bytes read (0 <= n <= len(p)) and any error encountered. Even if Read returns n < len(p), it may use all of p as scratch space during the call. If some data is available but not len(p) bytes, Read conventionally returns what is available rather than block waiting for more.

At the end of the input stream, Read returns 0, os.EOF. Read may return a non-zero number of bytes with a non-nil err. In particular, a Read that exhausts the input may return n > 0, os.EOF.

type Reader interface {
    Read(p []byte) (n int, err os.Error)
}

io/#Reader

For example, to read the first 16 random bytes,

package main

import (
    "fmt"
    "crypto/rand"
)

func main() {
    b := make([]byte, 16)
    n, err := rand.Read(b)
    fmt.Println(n, err, b)
}

Using a package init() function, crypto/rand defaults to using /dev/urandom.

// Easy implementation: read from /dev/urandom.
// This is sufficient on Linux, OS X, and FreeBSD.
func init() { Reader = &devReader{name: "/dev/urandom"} }

crypto/rand/rand.go

peterSO
You can access to */dev/urandom* because it has been defined on `init()`, but not to `newReader` (which uses */dev/random*) because it's unexported.
Because newReader and devReader are not exported, effectively, /dev/urandom is always used.
peterSO