Ho bisogno di token unici per gli utenti memorizzati nel mio DB. Nel momento in cui genera un token, lo controllo per l'univocità nel DB prima di utilizzarlo. È un test che devo effettivamente eseguire o sto perdendo tempo?Rails, ruby: è necessario verificare SecureRandom.urlsafe_base64 per l'unicità dei token?
Ho guardato il Ruby 2.0.0 API for SecureRandom e non chiarisce se posso "fidarmi" dell'unicità o meno.
So che nessun valore casuale può essere davvero "unico" e c'è un numero finito di possibilità. Ma con 32 bit di valori esadecimali mi sento sicuro di non incappare mai più nello stesso valore nella mia app, ma volevo chiedere se qualcuno sapeva di un "pasticcio" con questa situazione.
Un'altra considerazione sta usando SecureRandom.uuid
ma che sarà essenzialmente la stessa situazione.
# 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
Anche la risposta inviata da @tompave è valida. Tuttavia, l'uso del generatore SecureRandom.uuid non richiede alcun lavoro aggiuntivo, quindi lo contrassegno come la migliore soluzione per la mia particolare domanda (il modo "garantito" di token unici). La specifica UUID 4 "dovrebbe" avere anche 122 bit casuali (da quello che ho letto) quindi non è solo unica, ma è anche sicura in quanto gli utenti non possono facilmente "indovinare" un altro UUID. –