2017-11-08 27 views
3

우리는 8 백만 행 DB에 UUID 열을 추가했으며 기본값은 postgres uuid_generate_v4() 함수를 사용하여 생성됩니다.postgres를 사용할 때 많은 중복 값 uuid_generate_v4

current = 1 
batch_size = 1000 
last_id = 80000000 

while current < last_id 
    start_id = current 
    end_id = current + batch_size 
    puts "WORKING ON current: #{current}" 
    ActiveRecord::Base.connection.execute <<-SQL.squish 
    UPDATE table_name 
    SET public_id = uuid_generate_v4() 
    WHERE id BETWEEN '#{start_id}' and '#{end_id}' AND public_id IS NULL 
    SQL 
    current = end_id + 1 
end 

그러나, 스크립트의 끝에서, 우리는 우리가 135 개 중복을 남겼 일부도이 가능한 방법 3.를 갖는

우리는이 스크립트를 사용하여 UUID를 채웠다? uuid_generate_v4() 함수는 이러한 높은 확률로 중복 코드를 생성합니까?

+0

호스트에서 https://linux.die.net/man/3/uuid_generate_random을 확인하는 것이 좋습니다. –

+0

임의의 숫자 소스를 의심합니다. http://ralphbecket.blogspot.com.au/2011/09/birthday-paradox-and-guid-collisions.html –

답변

0

어떤 OS를 사용하고 있습니까?

https://security.stackexchange.com/questions/93902/is-postgress-uuid-generate-v4-securely-random에 따르면 ossp 확장자는/dev/urandom을 사용하므로 항상 예상대로 작동하지 않을 수 있습니다. (나는 그 주장을 확인하지 않았다.)

대신 gen_random_uuid()을 사용해 보셨습니까?

+0

나는 gen_random_uuid()를 사용하지 않았다. –

+0

우리는 우분투 인 heroku에있다. 우리 postgres db는 RDS –

+0

@MatthewBerman에 있습니다. 그러면 AWS에 도움을 요청할 것입니다. 어떤 PostgreSQL을 사용하고 있습니까? RDS PostgreSQL (9.5.4)에서 문제를 재현 할 수 없습니다. –

0

https://doxygen.postgresql.org/uuid-ossp_8c.html#a9effb407a94b4ecc119d9546cd102c94

#ifdef HAVE_UUID_E2FS 
    uuid_t  uu; 

    uuid_generate_random(uu); 

그래서 당신은 확인하려고 할 수 있습니다 /dev/urandom, 예를 들면 :

for i in $(seq 1 8000000); do uuidgen >>/tmp/u; done 
-bash-4.2$ cat /tmp/u | sort | uniq -c | sort -r | head -3 
     1 fffe894a-63e3-47e0-aea2-563f9652afd3 
     1 fffbb781-61d5-4751-b4eb-e45a8ed684b7 
     1 fffa7bff-ea37-46db-925b-d58f931512be 

조금 잔인한,하지만 당신은 여기에 속는를 보면 (왼쪽 1는 것 두 개 이상의, 당신 아마 uuid_generate_v1() 또는 /dev/urandom에 의존하지 않는 다른 기능을 사용하거나 추가로 일부 타임 스탬프를 사용하거나 다른 해결책을 찾아야합니다. https://www.postgresql.org/docs/current/static/uuid-ossp.html