我需要存储在我的数据库中的用户的唯一令牌。在我生成令牌时,我在使用它之前检查数据库中的唯一性。这是我真正需要执行的测试还是我浪费时间?Rails,ruby:需要检查SecureRandom.urlsafe_base64是否具有令牌唯一性?
我看过Ruby 2.0.0 API for SecureRandom,它并没有说明我是否可以“信任”唯一性。
我知道没有随机值真的可以是“唯一的”,并且存在有限数量的可能性。但是,对于32位的十六进制值,我确信我永远不会在我的应用程序中再次遇到相同的值,但想问问有没有人知道这种情况的“陷阱”。
另一个考虑因素是使用SecureRandom.uuid
,但这基本上是相同的情况。
# usage
user.password_reset_token = Generator.unique_token_for_user(:password_reset_token)
# Performs DB query to ensure uniqueness
class Generator
def self.unique_token_for_user(attribute)
begin
token = SecureRandom.urlsafe_base64(32)
end while User.exists?(attribute => token)
token
end
end
@tompave发布的答案也是可行的。但是,使用SecureRandom.uuid生成器不需要额外的工作,因此我将其标记为我的特定问题(“有保证”的独特标记方式)的最佳解决方案。 UUID规范4“应该”还有122个随机位(来自我读的),所以它不仅是唯一的,而且它也是安全的,因为用户不容易“猜测”另一个UUID。 –