2012-03-22 9 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)에는 63 비트 도메인보다 작은 53 비트의 가수 정밀도 만 있습니다. 그래서 짧은 답변, 난 63 비트에 무작위로 폭발 폭발 낮은 순위 비트에 스파 스 커버 리지 않을거야 그리고 당신은 핵심 PRNG (2 ** 48)와 동일한 공간으로 곱하면을 제한하면 더 나은 범위를 얻을거야, . – dbenhur