【发布时间】: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