Go — пример с крипто/рандом

Не могли бы вы привести небольшой пример использования crypto/rand[1]?

Функция Read имеет в качестве параметра массив байтов. Почему? Если он обращается к /dev/urandom для получения случайных данных.

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

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


person user316368    schedule 18.04.2010    source источник


Ответы (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.EOF. Read может вернуть ненулевое количество байтов с ошибкой, отличной от 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

person peterSO    schedule 18.04.2010
comment
Вы можете получить доступ к /dev/urandom, поскольку он был определен в init(), но не к newReader (который использует /dev/random), поскольку он не экспортирован. - person user316368; 19.04.2010
comment
Поскольку newReader и devReader не экспортируются, всегда используется /dev/urandom. - person peterSO; 19.04.2010