Ecco cosa sto usando. Il token non deve necessariamente essere sentito per indovinare, è più simile a un identificatore di URL breve di qualsiasi altra cosa, e voglio mantenerlo breve. Ho seguito alcuni esempi che ho trovato online e in caso di collisione, penso che il codice seguente ricrea il token, ma non ne sono davvero sicuro. Sono curioso di vedere suggerimenti migliori, tuttavia, poiché sembra un po 'agitato attorno ai bordi.
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
La colonna del mio database per il token è un indice univoco e sto anche utilizzando validates_uniqueness_of :token
il modello, ma poiché questi vengono creati in batch automaticamente in base alle azioni di un utente nell'app (in pratica effettuano un ordine e acquistano i token), è non è possibile che l'app generi un errore.
Potrei anche, credo, ridurre la possibilità di collisioni, aggiungere un'altra stringa alla fine, qualcosa generato in base al tempo o qualcosa del genere, ma non voglio che il token duri troppo a lungo.