Не могли бы вы привести небольшой пример использования crypto/rand
[1]?
Функция Read
имеет в качестве параметра массив байтов. Почему? Если он обращается к /dev/urandom для получения случайных данных.
func Read(b []byte) (n int, err os.Error)
Не могли бы вы привести небольшой пример использования crypto/rand
[1]?
Функция Read
имеет в качестве параметра массив байтов. Почему? Если он обращается к /dev/urandom для получения случайных данных.
func Read(b []byte) (n int, err os.Error)
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), поскольку он не экспортирован.
- person user316368; 19.04.2010