раньше использовали в postgres просто Integer c autoincrement (это primary key, на него настроены foreign keys' с других таблиц)
Но есть проблема, так как айди легко угадать, можно просто перебрать все айди от 1 до X, и получить информацию о всех объектах (по специфике работы необходим публичный доступ к одному из объектов по айди, это окно оплаты)
Сейчас мы планируем использовать просто айди типа String, созданные из питона через модуль secrets
Есть ли какие-то минусы такого подхода, или в данном случае действительно лучше не сделаешь?
Для такой задачи существует uuid
Но ведь это все равно строка, и по идее все, что меняется, это метод генерации, а в нашем случае токен, созданный через secrets лучше, чем uuid
минусов никаких нет, просто нужнен инсерт с while true и генерацией нового айди на ошибку
А точно нужен? Через secrets вроде же гарантированно криптографически уникальный токен
А можешь сказать что именно в secrets юзаешь, посмотрю срц. Но что-то мне подсказывает, что такое невозможно)
А если и uuid угадают? Нужна авторизация + проверка на возможность доступа к данным у авторизованного пользователя.
это есть вообще-то
Посмотрите на UUID.
Но шанс угадать uuid/уникальный в разы меньше, чем просто перебрать число в диапазоне
если тебе нужен ограниченный доступ, то тут только authorization, зачем полагаться на рандом
Нет, не ограниченный доступ. Система авторизации с OAuth scopes есть, там все нормально (токены авторизации тоже через secrets создаются, не uuid же для них использовать) Просто есть окно оплаты, где пользователь условно открывает example.com/i/{someid} Ну и для оплаты понятное дело не нужно авторизироваться, поэтому доступ к конкретному одному объекту (ладно, двум)) по айди открыт Все остальное защищено авторизацией Вот поэтому и нужно что-то более-менее нормальное для URL, базы и сложное для подбора Насчет UUID или secrets, я наверное выберу secrets Но все же исходный вопрос: primary key в таблице лучше делать строкой, или все же числом?
Из минусов, secrets может быть долгий. Попробуйте померить скорость генерации uuid4 и ваших строчек через secrets. Вдруг это будет существенно.
О. недавно платил, через какую-то кассу, там айди платежа был uuid4
Я смотрю наших примерные аналоги, у них явно не uuid, а что-то похожее на secrets
я использую ULID - Universally Unique Lexicographically Sortable Identifier, в бд (postgres) храню как uuid4
Звучит интересно, спасибо, посмотрю
Хм, возможно и так. В данный момент разницы нет, но может в будущем будет влиять. uuid генерируется примерно в 21 раз быстрее
кажется нужно переписать на го)
Не) Ну пока неизвестно что лучше, буду думать, может ещё кто напишет. Но уже точно решил, что это будут строки, не числа)
И там обращения к системному ГПСЧ будут долгими.
какая разница - все же байты
Обсуждают сегодня