2012-03-22 5 views
5

テーブルfooの列を作成するとします。bar非常に大きなランダムな整数である必要があります。PostgreSQLのrandom()関数の品質は?

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

これを行うにはこれが最善の方法ですか?誰もPostgreSQLのrandom()の機能について話すことができますか?乗算はここでエントロピーをマスクしていますか?

doは、/dev/randomに良いハードウェアエントロピーを供給していることに注意してください。

答えて

11

Postgresql randomは、POSIX erand48portable implementationに基づいています。 48ビットドメインではlinear congruential PRNGです。

暗号の強いエントロピーを生成するために使用されるpg_cryptoモジュールのgen_random_bytes関数に、より強く見えるものが必要な場合は、

+2

これはオープンソースの美しさです! –

+1

この質問の乗算部分に関するこれ以上の情報はありませんか?乗算はここでエントロピーをマスクしていますか? –

+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