То, что я собираюсь сделать, это URL, очень похожий на Basecamp :
https://3.basecamp.com/4000818/buckets/7452203/message_boards/1039416768
Я уже достиг этой функциональности, следуя этому руководству ,но я не удовлетворен процессом необходимости запуска потенциально миллионов .exists?поиск, чтобы найти открытый номер и бояться, что это очень быстро подорвет производительность моего приложения.
def set_hash_id
hash_id = nil
loop do
hash_id = SecureRandom.urlsafe_base64(9).gsub(/-|_/,('a'..'z').to_a[rand(26)])
break unless self.class.name.constantize.where(:hash_id => hash_id).exists?
end
self.hash_id = hash_id
end
Мне трудно поверить, что Basecamp полагается на что-то настолько неэффективное при каждом сохранении записи, и я ищучтобы узнать, как они это делают, или найти установку, которая будет выглядеть одинаково, но без дополнительных затрат из связанного учебника.
Буду признателен за любой вклад в методы для генерации непоследовательного идентификатора записи.Меня не интересуют UUID, так как я не выношу неприятные URL, которые они генерируют.Кроме того, они должны быть целыми числами.В принципе, точно так же, как URL Basecamp, но без накладных расходов существует?чеки.Возможно ли, что они делают какую-то комбинацию чисел с закодированной временной меткой или что-то, чтобы гарантировать отсутствие коллизий?Я исследовал метод hashids.org , но он не генерирует хэши, содержащие только целые числа.
Я использую Postgres в качестве базы данных, если это полезно.