在Rails 3中生成唯一的32个字符的字符串

时间:2011-05-25 16:51:33

标签: ruby-on-rails ruby-on-rails-3

我有一个具有app_id和secret_key字段的应用程序模型。生成唯一app_ids的最佳方法是什么?

我可以使用ActiveSupport:SecureRandom.hex(16)生成一个32字符的字母数字字符串,并且可能没有其他字符串。如果以这种方式完成,我是否也应该进行数据库检查以确定是否存在重复的app_id,或者这个步骤是否不必要,因为它的可能性非常小?

或者有更好的方法吗?

谢谢!

2 个答案:

答案 0 :(得分:3)

我总是会仔细检查,只是为了确定。在app_id上放置一个唯一索引,并且全部设置完毕。很难保证唯一性

但是,您可以构建一个保证唯一的字符串。

string = ActiveSupport::SecureRandom.hex(16)
append = @app.id.to_s
string = string.slice(0, string.length - append.length) + append

所以第一部分是随机的,但它始终以数据库id列结束,该列必须是唯一的。

这也有可能保持随机外观结构的变化,例如:使用Caesar Cipher或简单的数字到字母密码。

答案 1 :(得分:2)

我先检查一下。

这是我在设计中看到的一些代码,用于生成唯一令牌(为您的示例修改):

loop do
  token = ActiveSupport::SecureRandom.hex 16
  break token unless find(:first, :token => token)
end

第162行: https://github.com/plataformatec/devise/blob/master/lib/devise/models/authenticatable.rb