2016-06-15 5 views
0

投稿モデルの属性がtokenです。特定の文字の長さに固有のトークンが残っていないか確認してください。

私はSecureRandom.urlsafe_base64(length_of_token)を使用してトークンを作成しています。

トークンは推測不能である必要はありませんが、一意である必要があります。

トークンの長さは1文字から始まり、すべて使い切ったとき(64通りの組み合わせ)、2文字のトークンを持つべきです。

3文字のトークンにトークンのバリエーションが残っているかどうかを確認するにはどうすればよいですか?

+0

method引数には、_bytes_の数を指定します。したがって、 'urlsafe_base64(1)'は256個の値を生成し、 'urlsafe_base64(2)'は65,536個の値を生成します(256^n)。さらに、「長さ」2の65,535トークンが作成されている(1つだけ残っている)と仮定すると、その最後のものをどのように生成しますか? – Stefan

答えて

2

それのようなものであろう:

64**n - Post.count(:token).where('char_length(token) = ?', n) 

最初の部分は、可能な組み合わせの数と第二に、nのトークン長さを持つレコードの数を与えます。

ただし、ランダムジェネレータが必ずしも残りの可能な組み合わせを生成するとは限りません。当時は指数関数的に衝突がますます多く発生するため、この種の実装を強く妨げています。

注:char_lengthステートメントはMySQL固有のものなので、RDBMSによっては、この部分を変更する必要があります。

+0

「64^n」は「64 ** n」と等価ではありません – Stefan

+0

ステファンありがとう、私はそれを変更しました – basgys

関連する問題