Вторичный псевдослучайный уникальный ключ для записей, использующих Ruby on Rails и PostgreSQL - PullRequest
0 голосов
/ 20 сентября 2011

Я хочу добавить вторичный сгенерированный ключ для моих таблиц в приложении Ruby on Rails, которое в настоящее время использует базу данных PostgreSQL.Если возможно, я бы хотел быть независимым от базы данных.Цель состоит в том, чтобы использовать эти ключи в URL-адресах, чтобы внешние пользователи не могли угадать размер базы данных или количество записей каждого типа, которое у меня есть.

Я знаю о UUID, но они длинные и избыточны.Кроме того, это поле должно быть проиндексировано, и я понимаю, что случайные данные в индексе проблематичны.

Если нет чистого решения, я просто составлю небольшую формулу для применения к идентификатору и обязательно проверюстолкновения и избегать их;но я уверен, что я не первый, у кого эта проблема.

Ответы [ 2 ]

0 голосов
/ 23 сентября 2011

Я думаю сделать это:

SecureRandom.urlsafe_base64(n * 3).gsub(/[A-Z\-_]/, "")[0..n]

, где n - безопасное базовое начальное число ... Я бы сказал, 5 или 6. Я отфильтровываю некоторые символы, которые мне не нужныв удостоверении личностиКогда происходит столкновение с базой данных, я запускаю ее снова, но увеличиваю n, поэтому, если таблица внезапно получает сумасшедшее количество записей, не нужно столько попыток найти доступную.

0 голосов
/ 20 сентября 2011

В прошлом у меня было что-то похожее на это, я использовал SHA-хэши, которые были сделаны из строки из идентификатора и create_at, или что угодно, что сделало бы эту строку уникальной, и выполнил hexdigest.

что-то вроде, код не проверен

Digest::SHA1.hexdigest( self.id.to_s + self.created_at.to_s )

Даже если вам удастся создать запись одновременно, идентификатор должен дать вам уникальную строку.Это не гарантирует полную уникальность, поскольку это хеш, но шансы невелики, и вы можете запустить проверку, чтобы убедиться в наличии дубликатов, или по возможности установить базу данных.

надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...