【问题标题】:What is the PRNG algorithm used in Rust's `rand` crate?Rust 的 rand 板条箱中使用的 PRNG 算法是什么?
【发布时间】:2022-01-20 07:50:56
【问题描述】:

我正在编写一个网络应用程序,它将进行一些财务模型模拟。只是为了好玩和学习新事物的机会,我决定将所有数学和模拟卸载到 WebAssembly 并在 Rust 中实现 wasm。

因此,我正在研究 Rust 的 PRNG。我找到了一个Mersenne Twister crate,而 MT 显然是一种成熟的算法(甚至在几种语言中默认使用),但是这个特定的 crate 似乎不是很受欢迎。我也知道 Rust 有一个 rand crate “内置”(如果这甚至是一件事),但我还没有找到任何信息:

  • rand使用的算法是什么?
  • 该算法在随机性质量方面与其他算法(例如 MT)相比如何?

明确一点:我正在评估统计随机性(模拟随机过程)的算法,不是加密安全性。

【问题讨论】:

  • rand crate 是开源的并且有很好的文档记录。包含的生成器上有一个页面:rust-random.github.io/book/guide-rngs.html
  • 如果您从链接到的页面开始并点击相应的链接,您将到达Struct rand::rngs::StdRng“当前使用的算法是 12 轮的 ChaCha 块密码。”我建议你确认我走的是正确的道路。
  • Re:算法,避免 MT。它臃肿并且不会产生很好的随机性。对于模拟,您几乎肯定想要 xoshiro 家族中的某些东西,例如 xoshiro256++

标签: random rust


【解决方案1】:

我也知道 Rust 有一个“内置”的 rand crate(如果这是一个东西的话),但我没有找到任何信息:

  • rand 中使用的算法是什么?

文档需要跳来跳去,但看起来很清楚?

random 重定向到thread_rng,该结构指向ThreadRng 结构,该结构记录了它使用与StdRng 相同的PRNG,它说:

当前使用的算法是 12 轮的 ChaCha 分组密码。请参阅this relevant rand issue 进行讨论。

*该算法在随机性质量方面与其他算法(例如 MT)相比如何?

ChaCha 是一种加密安全的 PRNG(它被用于每个 BSD 的系统 RNG 以及 Linux),而 MT 绝对不是;并且ChaCha在随机性质量方面远远优于MT。

这确实是有代价的,CSPRNG 往往比非安全 PRNG 慢(因为它们的目标完全不同)。虽然 MT 的速度不如 PRNG 快,但 chacha12 可能很有竞争力。

rand 还提供了SmallRng,这是一个非加密 PRNG,具有相当好的统计特性,非常快。

【讨论】:

  • 感谢您的回答。我只是想评论一下,对我来说(我才刚刚开始学习 Rust,甚至还没有完全理解特征等概念)根本不明显要遵循哪些链接,我认为其他初学者也可能会遇到困难.事实上,我被 Google 引导到了 docs.rs/rand 的子页面,随后完全错过了 rust-random.github.io 的非现场链接,其中包含真正丰富的信息。 (感谢@denys-seguret 在评论中提到这一点。)
  • 请注意,我发布的所有 lins(除了 github 问题)都在 docs.rs/rand
  • 另外我认为 rust-random.github.io 上的信息不是最新的:因为StdRng 现在是 ChaCha12 它的性能应该在 ChaCha8 和 ChaCha20 之间(可能更接近前者而不是后者)。
  • 还有 rand::rngs 页面(从 crate 主页链接到两者,并显示在搜索结果中)指出,"StdRng 是为良好性能而选择的 CSPRNG和安全信任(基于评论、成熟度和使用情况)。当前的算法是 ChaCha12,它已经成熟并经过严格分析。StdRng 提供了ThreadRng 使用的算法,但没有定期重新播种。"
【解决方案2】:

用作默认 PRNG 的算法是 12 轮的 ChaCha。这在 ThreadRngStdRng 中使用,这两者通常都是从系统的 CSPRNG 中播种的。

ChaCha12 与所有加密安全 PRNG 一样,通过了下一位测试。也就是说,给定 PRNG 的任意数量的输出,正确猜测下一位的概率比偶数要好得多,可以忽略不计。这是任何 PRNG 所能提供的最佳标准,并且比未通过此测试的 Mersenne Twister 好很多。

ChaCha 通常非常快,对于大多数用途来说,ChaCha12 是一个不错的选择。如果需要更强大的密码安全性,ChaCha20(即 20 轮的 ChaCha)是最保守的。 ChaCha 最著名的攻击是七轮。

如果您只需要快速、非加密的 PRNG,ChaCha8 是一个不错的选择。它通常比几乎所有其他 PRNG 都快,包括在我的测试中,PCG 和 Xoshiro256++(这是当前的SmallRng),并且仍然被认为是加密安全的(因此通过了下一位测试),但由于低安全边际,这将不是加密使用的负责任选择。然而,由于它的速度和统计特性,它对于大多数其他用途来说是一个不错的选择。

【讨论】:

    猜你喜欢
    • 2020-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-08
    • 2015-07-21
    • 2014-12-24
    • 2012-01-17
    • 1970-01-01
    相关资源
    最近更新 更多