5.2 范围
2 分钟阅读
随着时间的推移,项目范围不断扩大,Rand 从使用单体 crate 转变为使用「主」crate 加上多个单一用途 crate。对于新功能,必须考虑它是否适合 Rand 项目,以及适合放在何处。
小型、专注的 crate 可能出于多种原因使用,但我们不旨在将功能最大限度地拆分为小型 crate。因此,为某项功能使用独立 crate 的合理理由包括:
- 允许清晰的依赖层次(
rand_core) - 使功能可以独立使用(例如
getrandom) - 从广泛使用的 crate 中移除使用较少但代码量不小的功能(例如
rand_jitter和rand_distr都从rand中提取了功能) - 允许选择,既不为所有用户包含大量未使用的代码,也不产生大量新 crate(RNG 家族 crate,如
rand_xoshiro和rand_isaac)
Trait、基础与用户界面
Rand 项目的主要用户界面仍然是核心的 rand crate。该 crate 的目标包括:
- 易于使用
- 在单一位置暴露常用功能
- 允许使用额外的随机源和分布采样器
为更好地实现模块化,核心 trait 已移至 rand_core crate。该 crate 的目标包括:
- 以最少依赖暴露核心 trait
- 提供实现各种随机源所需的通用工具
外部随机源
主要(且通常唯一)的外部随机源是操作系统,通过 getrandom crate 接口。该 crate 还支持在少数 no_std 目标上使用 RDRAND。
对其他 no_std 目标的支持已被讨论,但实际实现工作很少。参见 getrandom#4。
rand_jitter crate 提供了 CPU Jitter 熵收集器的实现,仅因历史原因包含在 Rand 中。
伪随机生成器
Rand 库包含多个伪随机数生成器,原因如下:
- 实现
StdRng和SmallRng生成器 - 提供几种高质量替代生成器
- 历史使用
这些在「家族」crate 中实现,例如 chacha20、rand_pcg、rand_xoshiro。
我们收到了将新算法纳入库的多个请求;评估此类请求时,我们必须考虑以下几点:
- 纳入 Rand 的目的
- PRNG 是否密码学安全,如果是,此类声明的可信度如何
- 输出的统计质量
- 生成器的性能和特性
- 算法的接受度和第三方审查
分布
Distribution trait 由 Rand 提供,同时提供常用分布(主要是线性分布)。
额外分布打包在 rand_distr crate 中,该 crate 依赖 rand 并重新导出其所有分布。