生成尚未使用的随机数的更好方法是什么?

时间:2018-03-12 12:48:03

标签: ruby-on-rails activerecord

我需要生成一个尚未使用的随机9位数字。

这是我现在拥有的方式,并且它的工作非常完美,但是当桌子增长时,这可能会太棒了:

while true
    random_number = 9.times.map{rand(9)}.join
    found = Document.find_by(dfe_number: random_number)
    return random_number if found.nil?
end

有更好的方法吗?还是更快的方式?谢谢大家。

1 个答案:

答案 0 :(得分:0)

我假设您希望使用唯一的随机Document保存dfe_number的新实例。 在这种情况下,你应该采取一种“乐观”的方法,假设碰撞是非常不可能的。

因此你应该:

  1. documents.dfe_number
  2. 上定义数据库唯一约束
  3. 使用您的方法或dfe_number
  4. 获取新的随机'%09d' % rand(10 ** 9)
  5. 尝试插入新实例
  6. 抓住任何ActiveRecord::RecordNotUnique并重试
  7. P.S。:您应该确保Document实例的预期数量小于10 ** 10的数量级,或者如果无法保证,则使用更多的数字。