我用的是这个。令牌不一定需要被听到来猜测,它更像是一个短的 url 标识符,而不是其他任何东西,我想让它保持短。我在网上找到了一些例子,如果发生冲突,下面的代码将重新创建令牌,但我不是很确定。不过,我很好奇能否看到更好的建议,因为这个建议的边缘感觉有点粗糙。
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
我的令牌数据库列是一个唯一的索引,我也在模型上使用 validates_uniqueness_of :token
,但是因为这些是根据用户在应用程序中的操作自动批量创建的(他们下订单并购买令牌,本质上) ,让应用程序抛出错误是不可行的。
我想,为了减少碰撞的几率,我也可以在末尾添加另一个字符串,根据时间或者类似的东西生成一些东西,但是我不希望标记太长。