在haskell中保存随机数生成器的状态

在haskell中保存随机数生成器的状态,haskell,prng,Haskell,Prng,我目前正在使用Crypto.Random和Crypto.Random.DRBG Haskell库来生成随机数。但是,我发现自己需要将它们的状态存储在某种形式的文件中(例如.txt文件),因为我想在以后的某个时间点继续使用相同的生成器(这是因为我需要两个单独的程序以相同的顺序生成相同的随机数)。 上述库不是Show函数的实例。有人知道我如何存储提到的生成器的状态吗?您可以使用DRBG的git版本执行CtrDRBG的序列化(自提交9da47c4dabf9f6976edcbf938c4a1a4b95e

我目前正在使用Crypto.Random和Crypto.Random.DRBG Haskell库来生成随机数。但是,我发现自己需要将它们的状态存储在某种形式的文件中(例如.txt文件),因为我想在以后的某个时间点继续使用相同的生成器(这是因为我需要两个单独的程序以相同的顺序生成相同的随机数)。
上述库不是Show函数的实例。有人知道我如何存储提到的生成器的状态吗?

您可以使用DRBG的git版本执行CtrDRBG的序列化(自提交9da47c4dabf9f6976edcbf938c4a1a4b95e09b0c以来)。编辑:现在是黑客时代。要安装:

cabal update
cabal install DRBG
现在您应该能够使用
数据。在
CtrDRBG
上序列化
编码
解码
功能


编辑:我觉得我应该提到,与所有NIST SP 800-90发电机一样,DRBG可能无法提供您可能期望的特性。确实,生成器是确定性的,但是您的请求会扰乱状态,因此两次生成N个字节不会导致与生成2*N个字节的单个请求相同的字节。这是由于发电机的回溯电阻造成的。始终发出大小一致的请求并在幕后执行串联的缓冲策略可能会隐藏此行为。

如果要持久化和重放状态,为什么要使用加密强度PRNG?只需使用StdGen。因为我正在编写一个加密协议,需要DRBG的属性。并不是说我需要重播状态。正如我所说的,我需要两个(不同的)程序来生成相同的数字(在不同的时间点),而不需要传输它们。看看下面的例子,似乎很容易将持久性(例如通过实现
序列化
)添加到
状态。我看到的一个问题是散列算法,它被表示为一个函数,因此无法序列化。但是这些信息可以在反序列化过程中由用户提供。是的,我想是这样的,但我需要它被自动化。目前,我只是生成一个适当长度的随机数,并将其用作PRNG未来状态的种子。这实际上不是一个正确的状态保存,但它确保了其他PRNG生成相同的de号。您始终可以提交github问题以请求实例显示、读取或序列化某些DRBG生成器。维护人员很懒,速度有点慢,但这并不难。或者,您可以提交一个补丁。