【问题标题】:Go - Example about crypto/randGo - 关于 crypto/rand 的示例
【发布时间】:2010-04-18 14:45:41
【问题描述】:

可以举一个关于crypto/rand [1] 的使用的小例子吗?

函数Read 有一个字节数组作为参数。为什么?如果它访问 /dev/urandom 来获取随机数据。

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

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

【问题讨论】:

    标签: random cryptography go


    【解决方案1】:
    func Read(b []byte) (n int, err os.Error)
    

    Read 是一个调用Reader.Read 的辅助函数。 Reader 定义为:var Reader io.Reader

    crypto/rand/

    io.Reader 是包装基本Read 方法的接口。

    Read 最多可将len(p) 字节读入p。它返回读取的字节数 (0 <= n <= len(p)) 和遇到的任何错误。即使Read 返回n < len(p),它也可能在调用期间使用所有p 作为暂存空间。如果某些数据可用但len(p) 字节不可用,Read 通常会返回可用的数据,而不是阻塞等待更多。

    在输入流的末尾,Read 返回0, os.EOFRead 可能会返回非零字节数和非nil 错误。特别是,耗尽输入的 Read 可能会返回 n > 0, os.EOF

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

    io/#Reader

    例如,读取前 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"} }
    

    crypto/rand/rand.go

    【讨论】:

    • 您可以访问 /dev/urandom,因为它已在 init() 上定义,但不能访问 newReader(它使用 /dev/random) 因为它没有被导出。
    • 因为 newReader 和 devReader 没有被导出,所以实际上总是使用 /dev/urandom。
    猜你喜欢
    • 2012-08-31
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    • 2011-06-15
    • 2018-02-16
    • 1970-01-01
    • 1970-01-01
    • 2019-07-25
    相关资源
    最近更新 更多