在Cats文档中,当描述State monad的使用时,给出了一个有吸引力的pure functional PRNG实现。但是,我见过的库(Breeze,Spire)使用了可变的生成器。为什么?另外,是否有任何利用Cats方法的库?
答案 0 :(得分:0)
JörgW Mittag在评论中写道:
但是,如果我不得不猜测,我会有一个主意:是的,处理可变状态非常困难。但是,编写好的PRNG,尤其是CSPRNG也很困难。也许,作者只是认为处理已经存在,经过审查,经过战斗测试的PRNG的可变状态要比创建自己的PRNG容易得多?请注意,尤其是对于CSPRNG,不仅密码属性很重要,而且性能也很重要。否则,您的超安全超纯CSPRNG只会成为DoS攻击的攻击载体。另外,要提防定时攻击和其他附带渠道。
特别是,链接到的RNG具有一些众所周知的缺点,因此不建议用于加密。
答案 1 :(得分:0)
实际上,已接受的答案不正确。由于RNG本身的质量,Breeze&Spire不使用可变RNG。他们这样做是为了程序上的方便。
功能性RNG需要以状态monad形式编写程序(如Cats文档中所示),通常在for表达式中使用RNG的所有用法。如果还存在其他Option
,Future
等单声道效果,则需要通过诸如monad-transformers组成。