这就是我正在使用的.令牌不一定要被猜测,它更像是一个短网址标识符,而不是其他任何东西,我想保持简短.我已经按照我在网上找到的一些例子,如果发生碰撞,我认为下面的代码会重新创建令牌,但我不确定.不过,我很想看到更好的建议,因为边缘感觉有点粗糙.
def self.create_token
random_number = SecureRandom.hex(3)
"1X#{random_number}"
while Tracker.find_by_token("1X#{random_number}") != nil
random_number = SecureRandom.hex(3)
"1X#{random_number}"
end
"1X#{random_number}"
end
Run Code Online (Sandbox Code Playgroud)
我的令牌的数据库列是一个唯一的索引,我也在validates_uniqueness_of :token模型上使用,但因为这些是根据用户在应用程序中的操作自动批量创建的(他们下订单并购买令牌,基本上),它是让应用程序抛出错误是不可行的.
我猜,我也可以减少碰撞的几率,在最后添加另一个字符串,根据时间或类似的东西生成的东西,但我不希望令牌太长.
我有Guids很容易解决的问题.
特别是,对于密码重置工作流程,我想将Guid令牌发送到用户的电子邮件,并让他们使用令牌重置密码.由于guids是唯一的,这是非常安全的,并且节省了我通过电子邮件发送人员密码,这是有风险的.
我注意到Ruby 有一个Guid宝石 ; 但它看起来很旧,它把东西写入文件系统.
有谁知道可以创建全球唯一标识符的任何其他宝石?
我知道我可以回到:
(0..16).to_a.map{|a| rand(16).to_s(16)}.join
Run Code Online (Sandbox Code Playgroud)
但它看起来并不像是一个合适的GUID ......
我必须生成一个唯一的随机字符串,该字符串将存储在数据库中.为此,我使用了"uuidtools"宝石.然后在我的控制器中添加了以下行:
require "uuidtools"
Run Code Online (Sandbox Code Playgroud)
然后在我的控制器创建方法我已经声明了一个'temp'变量并生成一个独特的随机'uuid'字符串,如下所示:
temp=UUIDTools::UUID.random_create
Run Code Online (Sandbox Code Playgroud)
这是创建一个像这样的字符串:
f58b1019-77b0-4d44-a389-b402bb3e6d50
Run Code Online (Sandbox Code Playgroud)
现在我的问题是我必须缩短它,最好在8-10个字符之内.现在我该怎么办?是否可以传递任何参数使其成为理想的长度字符串?
提前致谢...