golang的随机包 rand.go 中我们可以看到 rand.Read 其实是调用的io.Reader.Read()

   1: // Package rand implements a cryptographically secure

   2: // pseudorandom number generator.

   3: package rand

   4:  

   5: import "io"

   6:  

   7: // Reader is a global, shared instance of a cryptographically

   8: // strong pseudo-random generator.

   9: // On Unix-like systems, Reader reads from /dev/urandom.

  10: // On Windows systems, Reader uses the CryptGenRandom API.

  11: var Reader io.Reader

  12:  

  13: // Read is a helper function that calls Reader.Read.

  14: func Read(b []byte) (n int, err error) { return Reader.Read(b) }

io.Reader.Read() 函数的说明如下:

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 instead of waiting for more.

简单来说,它读出的数据,并不一定是指定长度的。

 

io.ReadFull 函数则相反:

ReadFull reads exactly len(buf) bytes from r into buf. It returns the number of bytes copied and an error if fewer bytes were read. The error is EOF only if no bytes were read. If an EOF happens after reading some but not all the bytes, ReadFull returns ErrUnexpectedEOF. On return, n == len(buf) if and only if err == nil.

读取正好len(buf)长度的字节。如果字节数不是指定长度,则返回错误信息和正确的字节数。

当没有字节能被读时,返回EOF错误。

如果读了一些,但是没读完产生EOF错误时,返回ErrUnexpectedEOF错误。

综上对比,获取随机数时,最好是下面的写法。

   1: import crand "crypto/rand"

   2:  

   3: r := make([]byte, length)

   4:  

   5: if _, err := io.ReadFull(crand.Reader, r); err != nil {

   6:     panic("error reading from random source: " + err.Error())

   7: }

 

参考资料:

rand.Read() or io.ReadFull(rand.Reader)?

https://groups.google.com/forum/#!topic/golang-nuts/eFS5GN-en3w

rand.Read() 和 io.ReadFull(rand.Reader) 的区别?的更多相关文章

  1. golang io.ReadFull

    buf := make([]byte, 10, 10) file, _ := os.Open("./data.txt") n, err := io.ReadFull(file, b ...

  2. PHP随机函数rand()、mt_rand()、srand()、mt_srand() 的区别

    1.生成随机数发生器种子的函数 srand(). mt_srand() 区别:mt_srand()  比 srand() 更好的生成随机数发生器种子 定义: void srand([int $seed ...

  3. 013-java中的IO操作-InputStream/Reader、OutputStream/Writer

    一.概述 IO流用来处理设备之间的数据传输,上传文件和下载文件,Java对数据的操作是通过流的方式,Java用于操作流的对象都在IO包中. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称 ...

  4. Linux IO函数的使用和区别

    Linux系统中的IO函数主要有read.write.recv.send.recvmsg.sendmsg.readv.writev,本篇主要介绍他们的使用以及区别. read函数: #include ...

  5. 简述同步IO、异步IO、阻塞IO、非阻塞IO之间的联系与区别

    POSIX 同步IO.异步IO.阻塞IO.非阻塞IO,这几个词常见于各种各样的与网络相关的文章之中,往往不同上下文中它们的意思是不一样的,以致于我在很长一段时间对此感到困惑,所以想写一篇文章整理一下. ...

  6. 同步IO、异步IO、阻塞IO、非阻塞IO之间的联系与区别

    POSIX 同步IO.异步IO.阻塞IO.非阻塞IO,这几个词常见于各种各样的与网络相关的文章之中,往往不同上下文中它们的意思是不一样的,以致于我在很长一段时间对此感到困惑,所以想写一篇文章整理一下. ...

  7. Java中输入时IO包与Scanner的区别

    最常用的一个IO控制台输入的 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream ...

  8. stm32 IO口八种模式区别

    初学STM32,遇到I/O口八种模式的介绍,网上查了一下资料,下面简明写出这几种模式的区别,有不对的地方请大家多多指正! 上拉输入模式:区别在于没有输入信号的时候默认输入高电平(因为有弱上拉).下拉输 ...

  9. go标准库的学习-crypto/rand

    参考:https://studygolang.com/pkgdoc 导入方式: import "crypto/rand" rand包实现了用于加解密的更安全的随机数生成器. Var ...

随机推荐

  1. iOS URL中汉字的编码和解码

    发现NSString类中有内置的方法可以实现.他们分别是: - (NSString *)stringByAddingPercentEscapesUsingEncoding:(NSStringEncod ...

  2. Java数据结构之排序

    1.冒泡排序:时间复杂度为O(n2) 假设是由小到大排序:相邻两个数之间进行比较,较大的数在后面.一次比较过后最大的数排在最后面 如:40.8.15.18.12一次排序后为:8.15.18.12.40 ...

  3. SUN dataset图像数据集下载

    SUN dataset数据集,有两个不错的网址: http://vision.princeton.edu/projects/2010/SUN/ (普林斯顿大学) http://groups.csail ...

  4. JS方法

    1.方法可作为对象使用 function aa() { this.a = "aaaa"; this.b = 23; this.f = function () { alert(thi ...

  5. 自定义View(7)官方教程:自定义View(含onMeasure),自定义一个Layout(混合组件),重写一个现有组件

    Custom Components In this document The Basic Approach Fully Customized Components Compound Controls ...

  6. [HZNUOJ1524]排队买票(DP)

    题目链接:http://acm.hznu.edu.cn/JudgeOnline/problem.php?id=1524 简单分析后可以知道每一个手持两元的小朋友前面,售票员手里至少有一个一元. 假设d ...

  7. poj 2773(容斥原理)

    容斥原理入门题吧. Happy 2006 Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 9798   Accepted: 3 ...

  8. Mac下配置idk

    Mac下配置java #以下进入啰嗦模式演示添加jdk7 #下载jdk7的mac版 #官网下载地址http://www.oracle.com/technetwork/java/javase/downl ...

  9. poj 2192 (DP)

    这个题题目意思是给你三个字符串str1,str2,str3.将str3从左自右扫描,去匹配str1和str2中的元素,不可重复,若存在一种匹配方法使得str1和str2都被匹配完全了,则输出yes,否 ...

  10. 2016年4月TIOBE编程语言排行榜 Visual Basic正渐行渐远

    COBOL, BASIC 和 FORTRAN 很长一段时间作为主力开发语言被使用.有很多软件使用这些语言来编写,并且发展的不亦乐乎.然而经过多年的发展,COBOL和FORTRAN逐渐被抛弃, 而得益于 ...