【问题标题】:Why do most Scala libraries use mutable RNG为什么大多数 Scala 库都使用可变 RNG
【发布时间】:2019-11-23 09:03:43
【问题描述】:

在 Cats 文档中,在描述 State monad 的使用时,给出了一个吸引人的 pure functional PRNG 实现。但是,我见过的库(Breeze、Spire)使用了可变生成器。为什么?另外,有没有使用 Cats 方法的库?

【问题讨论】:

  • 我认为这个问题不适合Stack Overflow。 1) Tt 包含两个问题,因此所问的实际 问题不清楚。 2)第二个问题是资源请求,因此离题。 3)第一个问题只能由微风和尖顶的作者来回答。如果他们在某处发布了该信息,那么问题是资源请求,因此是题外话。如果他们没有,那么问题就是要求读懂他们的想法,因此无法回答。
  • 如果我不得不猜测,我会有一个想法:是的,处理可变状态是困难。但是,编写一个好的 PRNG,尤其是 CSPRNG 也很难。也许,作者只是认为处理已经存在、经过审查、经过实战考验的 PRNG 的可变状态比创建自己的 PRNG 更容易?请注意,特别是对于 CSPRNG,不仅加密属性很重要,性能也很重要。否则,您的超安全超纯 CSPRNG 只会成为 DoS 攻击的攻击媒介。另外,请注意定时攻击和其他侧通道。
  • 特别是,您链接的 RNG 有一些众所周知的缺点,不建议用于加密。
  • 请随意将第二条评论作为您的答案,我会接受。谢谢。
  • Cats 示例只是一个演示,展示了如何使用 State monad 替换全局状态。但是正如它所提到的,它不适合加密或您需要不确定性的任何其他工作。在需要它的纯 FP 中,我宁愿期望 SecureRandom 包装在 IO monad 中:Cats IO、Monix Task 或 ZIO。但是有很多用例你都不需要,所以普通的旧 Random 就足够了。

标签: scala random functional-programming immutability


【解决方案1】:

Jörg W Mittag 在 cmets 中写道:

不过,如果我不得不猜测,我会有一个想法:是的,处理可变状态是很困难的。但是,编写一个好的 PRNG,尤其是 CSPRNG 也很难。也许,作者只是认为处理已经存在、经过审查、经过实战考验的 PRNG 的可变状态比创建自己的 PRNG 更容易?请注意,特别是对于 CSPRNG,不仅加密属性很重要,性能也很重要。否则,您的超安全超纯 CSPRNG 只会成为 DoS 攻击的攻击媒介。另外,请注意定时攻击和其他侧通道。

特别是,您链接到的 RNG 有一些众所周知的缺点,不建议用于加密。

【讨论】:

    【解决方案2】:

    实际上接受的答案没有抓住重点。由于 RNG 本身的质量,Breeze & Spire 不使用可变 RNG。他们这样做是为了编程方便

    功能性 RNG 需要以 state-monad 形式编写程序(如 Cats 文档中所示),通常在 for 表达式中使用 RNG 的所有用法。如果存在其他 monadic 效果,如 OptionFuture 等,则需要通过例如 monad-transformers 组合它们。

    【讨论】:

      猜你喜欢
      • 2011-04-28
      • 1970-01-01
      • 1970-01-01
      • 2011-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-11
      • 1970-01-01
      相关资源
      最近更新 更多