【问题标题】:obfuscate id in Rails with begin range使用开始范围混淆 Rails 中的 id
【发布时间】:2017-07-23 05:01:54
【问题描述】:

我正在尝试混淆几个模型中的 ID。

我使用this GitHub issue 中提出的解决方案完成了这项工作,并且工作正常(由于未来的兼容性问题,我不想使用gem)。

问题是生成的 id 很小。我希望他们从 1000000 开始。如何以正确的方式完成此操作?

模型代码:

 before_create :generate_random_id

 private 

 def generate_random_id
   self.id = SecureRandom.uuid
 end 

【问题讨论】:

标签: ruby-on-rails ruby database


【解决方案1】:

id 很小的原因是因为 UUID 字符串正在被转换为整数。请改用SecureRandom.random_number(100000000000)

您需要检查该数字是否大于 1000000 并且不在系统中。

before_create :generate_random_id

private 

def generate_random_id
  while self.id.nil? || Model.find_by_id(self.id) do
    self.id = SecureRandom.random_number(100000000000) + 1000000
  end
end 

使用 uuid 作为本机 id。 Postgresql 通过扩展很好地支持这一点:

CREATE EXTENSION pgcrypto;  
CREATE TABLE mymodel(  
   id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
   ...
);

【讨论】:

  • 创建新记录需要大量工作。也容易出现比赛条件。直接使用 uuid 会更好。
  • 但如果一个人必须使用整数(无论出于何种原因),那么就必须这样做,是的。
  • @SergioTulentsev Postgresql 原生支持这一点 - starkandwayne.com/blog/uuid-primary-keys-in-postgresql
  • 我终于决定用gem,不碰数据库里的id,感觉有点棘手。但是这个答案中的第二个选项对我有用。
【解决方案2】:

我希望他们从 1000000 开始。如何以正确的方式完成此操作?

所以只是转移起点。

def generate_random_id
  self.id = 1_000_000 + rand(1_000_000_000)
  # then, of course, make sure that you don't have a collision
  # (an existing record with this random id)
end 

【讨论】:

    猜你喜欢
    • 2020-06-13
    • 2020-02-16
    • 1970-01-01
    • 2019-04-27
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    • 2020-04-10
    • 2020-05-21
    相关资源
    最近更新 更多