我需要存儲在我的數據庫中的用戶的唯一令牌。在我生成令牌時,我在使用它之前檢查數據庫中的唯一性。這是我真正需要執行的測試還是我浪費時間?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。 –