Golang的crypto/rand包是否具备线程安全性?
crypto/rand 包 Read 方法的线程安全性分析
从math/rand.Rand的源码可知,当共享随机源时,它的Read方法并非线程安全。那crypto/rand包的情况如何?其底层依赖getrandom(2)系统调用或/dev/urandom设备,但并发调用的行为需要明确。
更新:已有评论帮助厘清
crypto/rand.Reader.Read(b []byte)和crypto/rand.Read(b []byte)的区别
针对线程安全性的两个判断点,结论如下:
- 并发调用
Read方法时是否会触发panic?
不会。crypto/rand底层依赖的getrandom(2)系统调用和/dev/urandom设备本身都是线程安全的,Go标准库的封装逻辑也保证了并发调用时不会触发panic。 - 并发调用时能否保持随机序列唯一性?是否会向不同调用者返回重复值?
可以保持唯一性,不会返回重复值。getrandom(2)和/dev/urandom的设计目标就是提供高质量的密码学安全随机数,并发请求时会为每个调用者生成独立的随机字节序列,不存在不同调用者拿到重复值的情况。
内容的提问来源于stack exchange,提问作者Josh Hibschman
相关产品推荐
相关产品推荐

