【问题标题】:Is there a optimal batch size for arc4random_buf?arc4random_buf 是否有最佳批量大小?
【发布时间】:2019-03-10 12:42:14
【问题描述】:

我需要来自 arc4random_buf 的数十亿个随机字节,我的策略是一次请求 X 个随机字节,并重复多次。

我的问题是 X 应该有多大。由于 arc4random_bufnbytes 参数可以任意大,我想必须有某种内部循环,每次执行其主体时都会产生一些熵。比如说,如果 X 是每次迭代生成的随机字节数的倍数,则性能可以提高,因为我没有浪费任何熵。

我在 macOS 上,不幸的是它是闭源的,所以我不能简单地阅读源代码。是否有任何便携式方法来确定最佳 X?

【问题讨论】:

  • 听起来基准测试是您最好的选择。
  • @pjs 有点离题,但我刚刚阅读了您的个人资料,并认为您可以为my question on Cross Validated 提供一些很好的见解?
  • macOS 的大部分内容实际上是开源的。 arc4random_buf() 的实现是 here
  • @pjs 是!最初我期待一个快速的答案,比如“CSPRNGs are good for Monte Carlo simulations”,但阅读这些论文肯定会教会我很多东西。也感谢您的链接!

标签: c macos performance random arc4random


【解决方案1】:

在典型的目标系统上做一些基准测试可能是解决这个问题的最好方法,但看看几个实现,缓冲区大小似乎不太可能对arc4random_buffer 的成本产生太大影响。

最初的实现将arc4random_buffer 实现为一个围绕生成一个字节的函数的简单循环。只要缓冲区足够大以避免过多的调用开销,它应该没什么区别。

FreeBSD 库实现似乎试图通过定期计算大约 1K 的随机字节来进行优化。然后arc4random_buffer 使用memcpy 将字节从内部缓冲区复制到用户缓冲区。

对于 FreeBSD 实现,最佳缓冲区大小将是内部缓冲区中可用的数据量,因为这样可以最大限度地减少对 memcpy 的调用次数。但是,没有办法知道它是多少,并且由于密钥更新算法,每次调用都不相同。

我的猜测是,您会发现大于 16K 的缓冲区大小之间的差异非常小,甚至可能更小。对于 FreeBSD 实现,如果缓冲区大小是 8 的倍数,效率会稍微高一些。


附录:我所知道的所有实现都有一个全局密钥更新阈值,因此您无法通过更改 arc4random_buffer 中的缓冲区大小来影响密钥更新成本。该库只需对生成的每 X 个字节重新设置密钥。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-09
    • 2018-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-04
    • 1970-01-01
    相关资源
    最近更新 更多