2017-11-08 23 views
3

私たちは8000万行のDBにUUID列を追加し、デフォルトはpostgres uuid_generate_v4()関数を使用して生成されます。postgresを使用すると重複した値uuid_generate_v4

私たちは、このスクリプトを使用してUUIDを埋め戻す:

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 

しかし、スクリプトの最後に、我々はいくつかのもこれが可能であるどのように3を持って、我々は135の重複を持っていたことが分かりましたか? 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です。これはubuntuです。私たちのpostgresデータベースは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 

少し残酷な、しかし、あなたはここにdupesを見れば(左1になりますもっとして1、あなたはおそらくuuid_generate_v1()または /dev/urandomに依存しないか、またはさらにタイムスタンプを使用するか、他の解決策を探すべき他の機能を使用する必要があります。 https://www.postgresql.org/docs/current/static/uuid-ossp.html

関連する問題