4.6 升级到 0.10

原文链接: https://rust-random.github.io/book/update-0.10.html

下文提供了将代码从 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。例如:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
use rand::{rngs::ChaCha8Rng, Rng, SeedableRng};

let mut rng1: ChaCha8Rng = rand::make_rng();
let _ = rng1.next_u64();

let mut rng2 = ChaCha8Rng::from_seed(rng1.get_seed());
rng2.set_stream(rng1.get_stream());
rng2.set_word_pos(rng1.get_word_pos());

assert_eq!(rng1.next_u64(), rng2.next_u64());

其他更改

TryRngCore::read_adapter 已被 rand::RngReader 替换。

ReseedingRng

ReseedingRng 已被移除且没有替代品,因为据我们所能判断,ThreadRng 是唯一重要的用例。因此我们选择将其功能作为实现细节移入 ThreadRng。

依赖

Rand crate 现在需要 rustc 版本 1.85.0 或更高。

对 getrandom 的依赖已升级到版本 0.4。参见 getrandom CHANGELOG。

特性

特性标志:

  • os_rng 已重命名为 sys_rng
  • small_rng 已被移除;其功能始终可用
  • chacha 是新特性,启用 rand::rngs::ChaCha{8,12,20}Rng

可复现性

rand v0.10 中没有已知的值破坏性更改。

最后修改 August 23, 2026: 更新 (499855b16)