2012-03-22 48 views
5

假設我正在創建一個表foo帶有一列bar應該是一個非常大的隨機整數。PostgreSQL的random()函數的質量?

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

這是最好的方法嗎?任何人都可以談論PostgreSQL的random()函數的質量嗎?這裏的乘法是否掩蓋了熵?

請注意,我有很好的硬件entropy饋入/dev/random

回答

11

Postgresql隨機是基於他們自己portable implementation的POSIX erand48。這是一個在48位域中的linear congruential PRNG

如果您需要更強的外觀,請參閱pg_crypto模塊的gen_random_bytes函數,該函數用於生成密碼學上的強熵。

+2

這是開源的美! – 2012-03-22 07:42:04

+1

有關這個問題的乘法部分的更多信息?這裏的乘法是否掩蓋了熵? – 2012-03-22 18:01:59

+2

你的號碼看起來像一個最大簽名長(2 ** 63-1),這是一個比pg的隨機產生的更大的域。一個[IEEE 754 double](http://en.wikipedia.org/wiki/Double_precision_floating-point_format)只有53比特的尾數精度,它也比你的63比特域小。所以簡短的回答,我認爲將隨機數擴展到63位將會得到低階位的稀疏覆蓋,如果將乘法限制在與核心PRNG(2 ** 48)相同的空間,您將獲得更好的覆蓋率。 。 – dbenhur 2012-03-22 19:05:22