PostgreSQL的random()函数质量如何?

Dus*_*and 5 random postgresql entropy prng

假设我正在创建一个带有列的表格foo,它应该是一个非常大的随机整数.

CREATE TABLE foo (
    bar bigint DEFAULT round(((9223372036854775807::bigint)::double precision * random())) NOT NULL,
    baz text
);
Run Code Online (Sandbox Code Playgroud)

这是最好的方法吗?任何人都可以谈论PostgreSQL的random()功能吗?这里的乘法是否掩盖了熵?

请注意,我确实有很好的硬件熵/dev/random.

dbe*_*hur 11

Postgresql随机是基于他们自己的POSIX erand48可移植实现.它是48位域中的线性同余PRNG.

如果您需要更强大的外观,请查看pg_crypto模块的gen_random_bytes函数,该函数用于生成加密强熵.

  • 这就是开源之美! (2认同)
  • 你的号码看起来像是一个最大签名长(2**63-1),这是一个比pg随机产生的更大的域.[IEEE 754 double](http://en.wikipedia.org/wiki/Double_precision_floating-point_format)只有53位的尾数精度,也小于你的63位域.如此简短的答案,我认为将随机爆发到63位将在低阶位获得稀疏覆盖,如果将乘法限制为与核心PRNG(2**48)相同的空间,您将获得更好的覆盖率. (2认同)
  • 请注意,我刚刚使用 gen_random_bytes() 函数发布了此示例:http://dba.stackexchange.com/a/15884/6776 (2认同)