这就是我正在使用的。令牌不必一定要猜测,它更像是一个短网址标识符,而不是其他任何东西,我想使其简短。我遵循了一些我在网上找到的示例,如果发生碰撞,我认为下面的代码将重新创建令牌,但是我不确定。不过,我很好奇看到更好的建议,因为这样的感觉有些粗糙。
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
模型上使用,但是由于这些是根据用户在应用程序中的操作自动创建的(它们实际上是下订单并购买令牌)而批量创建,因此让应用抛出错误是不可行的。
我想,我也可以减少冲突的机会,在末尾附加另一个字符串,这些字符串是基于时间生成的,或者类似的东西,但是我不希望令牌太长。