4.6 升级到 0.10
3 分钟阅读
下文提供了将代码从 rand 0.9 迁移到 rand 0.10 的说明。
以下是侧重于潜在破坏性更改的迁移指南。完整更改列表请参阅相关变更日志:
[Try]Rng trait
rand_core trait RngCore、TryRngCore 已重命名为 Rng、TryRng,rand trait Rng 分别重命名为 RngExt。
这些 trait 之间的关系也发生了变化;此前,每个 R: RngCore 都实现了 TryRngCore,但除此之外两个 trait 是独立的;现在 Rng: TryRng<Error = Infallible>,且每个 R: TryRng<Error = Infallible> + ?Sized 都实现了 Rng。
此外,虽然我们此前为每个 R: DerefMut where R::Target: RngCore 实现了 R: RngCore,但由于冲突 trait 错误我们无法这样做(解决此问题需要特化或负 trait 边界)。现在,我们为每个 R: DerefMut where R::Target: TryRng 实现了 R: TryRng,从而意味着为每个 R: DerefMut where R::Target: Rng 隐含了 R: Rng。
此处最大的影响是,不会失败的 PRNG 必须实现 TryRng 且 Error = Infallible,而不是实现 RngCore。
rand 的用户通常需要导入 rand::RngExt,可能需要从 R: RngCore 迁移到 R: Rng(请注意,虽然此前使用 R: Rng 的地方可能更倾向于保留 R: Rng,尽管直接替换是 R: RngExt;对于 R: Sized,两个边界是等价的)。
SysRng
rand_core::OsRng 已被 getrandom::SysRng 替换(也可作为 rand::rngs::SysRng 使用)。
因此 SeedableRng::from_os_rng 和 try_from_os_rng 方法已被移除。rand::make_rng() 作为部分替代;否则使用 SomeRng::try_from_rng(&mut SysRng).unwrap()。
PRNG
StdRng 现在由 chacha20 而非 rand_chacha 提供。目前两个包都在维护,但 rand_chacha 未来可能会被弃用。ChaCha{8,12,20}Rng 类型是 rand_chacha 同名类型的直接替代品;它们保持输出的可复现性并具有类似的 API。
请注意,rand::rngs 现在提供多个命名的 PRNG,使编写可复现代码更简单:ChaCha{8,12,20}Rng、Xoshiro{128,256}PlusPlus。
其他 PRNG crate 已以最小更改更新(尽管这可能不会无限期保持;参见 rngs#98)。新增了一个 crate:rand_sfc。
Clone 与序列化支持
StdRng 和 ChaCha{8,12,20}Rng 不再实现 Clone 或 serde trait。这是为防止意外密钥流重复或持久化到外部存储而做出的刻意选择。请注意,仍可通过使用相同密钥重建新实例,然后设置流(如适用)和字位置来克隆或序列化这些 RNG。例如:
| |
其他更改
TryRngCore::read_adapter 已被 rand::RngReader 替换。
ReseedingRng
ReseedingRng 已被移除且没有替代品,因为据我们所能判断,ThreadRng 是唯一重要的用例。因此我们选择将其功能作为实现细节移入 ThreadRng。
依赖
Rand crate 现在需要 rustc 版本 1.85.0 或更高。
对 getrandom 的依赖已升级到版本 0.4。参见 getrandom CHANGELOG。
特性
特性标志:
os_rng已重命名为sys_rngsmall_rng已被移除;其功能始终可用chacha是新特性,启用rand::rngs::ChaCha{8,12,20}Rng
可复现性
rand v0.10 中没有已知的值破坏性更改。