【发布时间】:2010-04-18 14:45:41
【问题描述】:
可以举一个关于crypto/rand [1] 的使用的小例子吗?
函数Read 有一个字节数组作为参数。为什么?如果它访问 /dev/urandom 来获取随机数据。
func Read(b []byte) (n int, err os.Error)
【问题讨论】:
标签: random cryptography go
可以举一个关于crypto/rand [1] 的使用的小例子吗?
函数Read 有一个字节数组作为参数。为什么?如果它访问 /dev/urandom 来获取随机数据。
func Read(b []byte) (n int, err os.Error)
【问题讨论】:
标签: random cryptography go
func Read(b []byte) (n int, err os.Error)
Read 是一个调用Reader.Read 的辅助函数。 Reader 定义为:var Reader io.Reader。
io.Reader 是包装基本Read 方法的接口。
Read 最多可将len(p) 字节读入p。它返回读取的字节数 (0 <= n <= len(p)) 和遇到的任何错误。即使Read 返回n < len(p),它也可能在调用期间使用所有p 作为暂存空间。如果某些数据可用但len(p) 字节不可用,Read 通常会返回可用的数据,而不是阻塞等待更多。
在输入流的末尾,Read 返回0, os.EOF。 Read 可能会返回非零字节数和非nil 错误。特别是,耗尽输入的 Read 可能会返回 n > 0, os.EOF。
type Reader interface {
Read(p []byte) (n int, err os.Error)
}
例如,读取前 16 个随机字节,
package main
import (
"fmt"
"crypto/rand"
)
func main() {
b := make([]byte, 16)
n, err := rand.Read(b)
fmt.Println(n, err, b)
}
使用包init()函数,crypto/rand默认使用/dev/urandom。
// Easy implementation: read from /dev/urandom.
// This is sufficient on Linux, OS X, and FreeBSD.
func init() { Reader = &devReader{name: "/dev/urandom"} }
【讨论】:
init() 上定义,但不能访问 newReader(它使用 /dev/random) 因为它没有被导出。