Esto es lo que estoy usando. El token no necesariamente tiene que ser escuchado para adivinar, es más como un identificador de URL corto que cualquier otra cosa, y quiero que sea breve. He seguido algunos ejemplos que he encontrado en línea y, en caso de colisión, creo que el siguiente código recreará el token, pero no estoy muy seguro. Sin embargo, tengo curiosidad por ver mejores sugerencias, ya que esto se siente un poco áspero por los bordes.
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 columna de mi base de datos para el token es un índice único y también lo estoy usando validates_uniqueness_of :token
en el modelo, pero debido a que estos se crean en lotes automáticamente en función de las acciones del usuario en la aplicación (hacen un pedido y compran los tokens, esencialmente), es no es factible que la aplicación arroje un error.
Supongo que también podría reducir la posibilidad de colisiones, agregar otra cadena al final, algo generado en función del tiempo o algo así, pero no quiero que el token se alargue demasiado.