问题描述
|
我有一个具有app_id和secret_key字段的应用程序模型。生成唯一app_id的最佳方法是什么?
我可以使用
ActiveSupport:SecureRandom.hex(16)
来生成32个字符的字母数字字符串,并且可能不会再有其他类似的字符串了。如果以此方式进行,我是否还应该进行数据库检查以查看是否存在重复的app_id或此步骤是否不必要,因为这样做的可能性极小?
还是有更好的方法?
谢谢!
提姆
解决方法
可以肯定的是,我总是会仔细检查。在
app_id
上放置一个唯一索引,它已设置好。很难保证唯一性
但是,您可以构建一个保证唯一的字符串。
string = ActiveSupport::SecureRandom.hex(16)
append = @app.id.to_s
string = string.slice(0,string.length - append.length) + append
因此,第一部分是随机的,但它总是以数据库id列结尾,该列必须是唯一的。
可能还会有一些变化来保持随机的外观结构,例如使用凯撒密码或简单的数字到字母密码。
,我先检查一下。
这是我在设计中看到的一些代码,用于生成唯一令牌(针对您的示例进行了修改):
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