Преобразование целочисленного идентификатора в строку со случайными символами и наоборот

63
6

У меня есть куча идентификаторов для некоторого контента, и у меня есть url с параметром GET следующим образом: id=202 (где 202 - это идентификатор контента, который пользователь хочет посмотреть). Я хочу избежать этого и преобразовать идентификатор в строку со случайными символами и цифрами, например YouTube (например: watch?v=QEllLECo4OM), а затем снова преобразовать его в целое число, чтобы я мог получать контент.

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

Это единственный способ сделать это? Или есть лучший алгоритм для этого?

Благодарю.

спросил(а) 2021-01-25T16:56:36+03:00 4 месяца, 4 недели назад
1
Решение
116

Для этой задачи есть библиотека: hashids.

Он не предназначен для библиотеки безопасности, а для обнуления числовых идентификаторов из базы данных.

Пример:

$hashids = new Hashids(); 
$id = $hashids->encode(1, 2, 3); // o2fXhV
$numbers = $hashids->decode($id); // [1, 2, 3]

ответил(а) 2021-01-25T16:56:36+03:00 4 месяца, 4 недели назад
45

Вы можете использовать php-функции как base64_encode (202 => MjAy), а затем base64_decode (MjAy => 202). Но это только немного запутывает, а не "секретно", если это ваше намерение.

ответил(а) 2021-01-25T16:56:36+03:00 4 месяца, 4 недели назад
-4

Таблица с идентификатором и случайной строкой намного безопаснее. Зачем?

нет расчета для изменения идентификатора никто извне не может угадать или пересчитать идентификатор никто не знает, сколько записей у вас уже есть в базе данных в виде их случайной строки

Если вы хотите выбрать более короткий номер, есть варианты

ps, чтобы сделать пользовательский конвертер более безопасным, вы можете изменить порядок номеров и символов в массиве Base62 (0-9, az, AZ) по-другому, поэтому не обязательно, какой персонаж получает номер

ответил(а) 2021-01-25T16:56:36+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема