为什么大多数Scala库使用可变RNG

时间:2019-07-14 10:30:28

标签: scala random functional-programming immutability

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

2 个答案:

答案 0 :(得分:0)

JörgW Mittag在评论中写道:

  

但是,如果我不得不猜测,我会有一个主意:是的,处理可变状态非常困难。但是,编写好的PRNG,尤其是CSPRNG也很困难。也许,作者只是认为处理已经存在,经过审查,经过战斗测试的PRNG的可变状态要比创建自己的PRNG容易得多?请注意,尤其是对于CSPRNG,不仅密码属性很重要,而且性能也很重要。否则,您的超安全超纯CSPRNG只会成为DoS攻击的攻击载体。另外,要提防定时攻击和其他附带渠道。

     

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

答案 1 :(得分:0)

实际上,已接受的答案不正确。由于RNG本身的质量,Breeze&Spire不使用可变RNG。他们这样做是为了程序上的方便

功能性RNG需要以状态monad形式编写程序(如Cats文档中所示),通常在for表达式中使用RNG的所有用法。如果还存在其他OptionFuture等单声道效果,则需要通过诸如monad-transformers组成。