Проверьте, остались ли какие-либо уникальные токены определенной длины символа

У меня есть модель Post с атрибутом token,

я использую SecureRandom.urlsafe_base64(length_of_token) создать токен.

Маркер не должен быть неуязвимым, но должен быть уникальным.

Я начинаю с токенов длиной 1 символ, и когда они все израсходованы (все 64 комбинации), я должен перейти к токенам длиной 2 символа.

Как мне проверить, есть ли какие-либо вариации токенов для токенов длиной 3 символа?

1 ответ

Решение

Это было бы что-то вроде:

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

Первая часть дает количество возможных комбинаций, а вторая - количество записей с длиной токена n.

Но не забывайте, что ваш генератор случайных чисел не обязательно будет генерировать оставшиеся возможные комбинации. Со временем будет экспоненциально увеличиваться число столкновений, поэтому я бы настоятельно не рекомендовал такой тип реализации.

Обратите внимание char_length Это специфичное для MySQL условие, поэтому в зависимости от вашей СУБД вам придется адаптировать эту часть.

Другие вопросы по тегам