使用postgres uuid_generate_v4时有许多重复值

时间:2017-11-08 05:36:32

标签: postgresql activerecord uuid

我们在8000万行DB中添加了一个UUID列,默认使用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

然而,在脚本的最后,我们发现我们有135个重复,有些甚至有3.这怎么可能? uuid_generate_v4()函数是否会产生具有如此高概率的欺骗?

2 个答案:

答案 0 :(得分:0)

您使用的是哪种操作系统?

根据https://security.stackexchange.com/questions/93902/is-postgress-uuid-generate-v4-securely-random,ossp扩展使用/ dev / urandom,因此它可能无法始终按预期工作。 (我没有检查过索赔。)

您是否尝试过使用gen_random_uuid()

答案 1 :(得分: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