我有一个具有app_id和secret_key字段的应用程序模型。生成唯一app_ids的最佳方法是什么?
我可以使用ActiveSupport:SecureRandom.hex(16)
生成一个32字符的字母数字字符串,并且可能没有其他字符串。如果以这种方式完成,我是否也应该进行数据库检查以确定是否存在重复的app_id,或者这个步骤是否不必要,因为它的可能性非常小?
或者有更好的方法吗?
谢谢!
添
答案 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