生成用于标识记录的唯一随机字符串

时间:2009-11-29 00:36:58

标签: ruby-on-rails

我要求能够通过一个唯一的密钥来识别表中的记录,在本例中是一个用户表,该密钥不会泄露表中记录的顺序。

目前我有主键字段,生成的路由如下:

/users/1

但是,我希望能够生成如下路线:

/users/kfjslncdk

我可以在路由端,数据库端等连接所有内容。但我不确定生成唯一字符串标识符的最佳方法是在rails中。我想做点什么:

before_save :create_unique_identifier

def create_unique_identifier
    self.unique_identifier = ... magic goes here ...
end

我以为我可以使用使用UUIDTools创建的guid的第一部分,但在保存用户之前我需要检查以确保它是唯一的。

非常感谢任何建议!

5 个答案:

答案 0 :(得分:44)

before_create :create_unique_identifier

def create_unique_identifier
  loop do
    self. unique_identifier = SecureRandom.hex(5) # or whatever you chose like UUID tools
    break unless self.class.exists?(:unique_identifier => unique_identifier)
  end
end

答案 1 :(得分:8)

Ruby 1.9 includes内置UUID生成器:SecureRandom.uuid

答案 2 :(得分:4)

答案 3 :(得分:3)

省去存储混淆id的麻烦,只需用基数62(a-z,A-Z,0-9)编码id,但自定义“数字”的顺序。这将使得弄清楚订单变得非常复杂。

我曾经写过一个类的东西(可能需要一些重构):https://gist.github.com/4058176

答案 4 :(得分:2)

另一种可能性是使用SecureRandom.base64,与hex相比,它另外使用大写字母和“ +”,“ /”,“ =”。 Documentation

示例:

def generate_identifier
  begin
    uid = SecureRandom.base64(8)
  end while self.class.exists?(uid: uid)
  self.uid = uid
end