只要并发调用不会导致 seg-v 或返回相同的值,当这些错误的主要影响是不可预测的结果并且这就是 PRNG 的重点时,有什么理由可以防止PRNG中的竞争条件和数据损坏?
编辑:是否有任何 PRNG 在竞争条件和数据损坏下不会受到影响?
只要并发调用不会导致 seg-v 或返回相同的值,当这些错误的主要影响是不可预测的结果并且这就是 PRNG 的重点时,有什么理由可以防止PRNG中的竞争条件和数据损坏?
编辑:是否有任何 PRNG 在竞争条件和数据损坏下不会受到影响?
当这些错误的主要影响是不可预测的结果时,这就是 PRNG 的重点?
“随机”与不可预测不同 - 随机意味着某种分布,如果您想要真正的随机数,则该分布非常重要。如果您的随机数以任何方式可预测,则可能是安全问题,或者至少是程序错误
PRNG 是精心构建的工具——坦率地说,如果竞争条件和线程错误是一个好的 PRNG,那么实现就会这样编写。
添加线程错误以增加随机性的问题在于它是对生成器的未经研究的更改。现有的安全算法和实现已经过详尽的测试;如果你想尝试一个不安全的变体,你需要做统计工作来证明它至少和普通 PRNG 一样随机。
它通常会使它们的确定性降低(如果您依赖于它们的确定性,这是很糟糕的,很多人都会这样做),并且可能会或可能不会使它们的伪随机性降低,这取决于它们的特定实现细节和硬件行为的微妙之处。
但通常编写多线程应用程序的人会在 TLS(线程本地存储)中声明他们的 PRNG 状态。这样就没有关系,每个线程都有自己的 PRNG,除非你故意创建它们,否则不会发生比赛。反正不在 PRNG 代码中。这是无锁且或多或少的完整性能(取决于使用的 TLS 实现)。