【问题标题】:Quality of PostgreSQL's random() function?PostgreSQL 的 random() 函数的质量?
【发布时间】:2012-03-22 03:37:52
【问题描述】:

假设我正在创建一个表 foo,其中的列 bar 应该是一个非常大的随机整数。

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

这是最好的方法吗?谁能谈谈 PostgreSQL 的 random() 函数的质量?这里的乘法是否掩盖了熵?

请注意,我确实将良好的硬件熵输入/dev/random

【问题讨论】:

    标签: postgresql random prng entropy


    【解决方案1】:

    Postgresql 随机是基于自己的portable implementation 的 POSIX erand48。这是 48 位域中的 linear congruential PRNG

    如果您需要更强大的功能,请查看 pg_crypto 模块的 gen_random_bytes 函数,该函数用于产生加密强熵。

    【讨论】:

    • 这就是开源的魅力!
    • 关于这个问题的乘法部分的更多信息?这里的乘法是否掩盖了熵?
    • 您的数字看起来像一个最大有符号长 (263-1),它比 pg 的随机产生的域更大。 IEEE 754 double 只有 53 位尾数精度,也小于 63 位域。所以简短的回答,我认为将随机数爆炸到 63 位将在低位得到稀疏覆盖,如果将乘法限制在与核心 PRNG 相同的空间(2 48).
    • 请注意,我刚刚使用 gen_random_bytes() 函数发布了这个示例:dba.stackexchange.com/a/15884/6776
    猜你喜欢
    • 2015-11-02
    • 2013-02-20
    • 2012-07-09
    • 2011-12-17
    • 2017-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-09
    相关资源
    最近更新 更多