为什么这个类在其线性同余公式中使用 48 位种子?我本来预计32或64 ...
我知道当要求 32 位值时它需要更高位。但是为什么只有 16 个额外的位呢?这是一个“随机”的选择吗?
您需要比输出位更多的状态位,因为 LCG 的性质使得状态的低位根本不是非常随机的。因此,如果您想要 32 位输出,则需要超过 32 位的状态。
为什么使用 48 而不是 64?因为 48 就足够了,而且你是在几十年前设计的,所以有充分的理由要避免使用比绝对必要更多的资源。
它背后的数学来自数论和伪随机数生成器的数学定义。这当然不是一个“随机”(被解释为任意)选择。
计算机上的随机数生成器实际上是在尝试成为真正的伪随机数生成器。
您可以将伪随机数生成器视为一个扩展函数,它接受一个输入seed
,然后输出一个数字流G(seed)
。
理想情况下,您希望您的伪随机数生成器与真正的随机数生成器无法区分,但您还必须意识到您的伪随机数生成器必须经过有效采样(多项式时间)和确定性(意味着它输出完全相同的流给定相同的输入种子)。
因此,只有 32 位种子空间意味着攻击者希望确定您的流是否真正随机(或根据随机数生成器破坏您的加密算法)只需通过 32 位密钥空间(种子空间)并采样生成器的输出与您提供的“随机”流进行比较,看看它是否匹配。添加更多 16 位会在密钥(种子)空间中显着增加范围,从而使枚举所有可能的密钥(种子)变得更加困难。
至于为什么不使用完整的 64 位……可能在实现算法时,硬件处理能力无法像今天在基于 x64 的现代处理器上那样有效地支持 64 位操作,因此它们停止在 48 位。