2017-02-06 3 views
0

Мне нужна строка с макс. 6 длиной и смешанная из числа и алфавита. Я проверил:создать уникальную строку в php с base_convert и ограниченной длиной

How can I make short random unique keys, like YouTube video IDs, in PHP?

и

PHP generate a unique string

, что было очень полезно, но они делают строку длиной 10 - 12. Мой вопрос заключается в том, что выход из этого кода всегда уникален или нет?

base_convert(microtime(false), 6, 36); 

или

base_convert(uniqid('test',true), 6, 36); 

Примечание: конвертировать из базы 6, но вход, очевидно, не будет базой 6. Я делаю это, потому что, если преобразовать от 10 до 36 он генерирует 10- 12 длина.

+0

Я не думаю, что это сработало бы вообще, так как вы пытаетесь конвертировать из базы 6, но вход, очевидно, не будет базой 6 – apokryfos

+0

@apokryfos да я делаю. Я делаю это, потому что, если я конвертирую от 10 до 36, он генерирует длину 10-12. Что делать? –

+0

Но основание 6 означает, что все цифры будут между 0-5, что не так. Вместо этого вы должны сделать ['substr'] (http://php.net/manual/en/function.substr.php) – apokryfos

ответ

1

Короткий ответ: Нет, но если вы делаете что-то крошечное, как персональный сайт, или внутренний инструмент, используемый очень немногими людьми, все будет в порядке.

Долгий ответ: Определенно нет, если вы пытаетесь сделать что-то безопасное или используете несколько серверов, совместно использующих базу данных. Атакующие могут точно определить, сколько времени требуется для их запроса на ваш сервер и бомбардировать его своими запросами, пока ваш сервер не будет генерировать повторяющиеся идентификаторы, если вы полагаетесь на microtime. Функция uniqid не гарантирует возврат значения uniq (прямо из руководства php) и, безусловно, генерирует повторяющиеся идентификаторы, если вы обновляете свое время с помощью NTP и настраиваете свое время на 5 секунд назад.

+0

как я могу сделать это лучше? –

+0

Самый простой способ сделать что-то уникальное - иметь атомарные операции со счетчиком. Самый простой способ сделать это - с базой данных SQL и полагаться на их автоматически увеличивающийся идентификатор, поскольку они уже позаботились обо всем, что возможно. Если вы не хотите использовать базу данных, вы можете создать файл в файловой системе, в котором будет храниться простое целое число. Вам нужно будет реализовать эксклюзивную блокировку файлов, блокировку ожидания и блокировку. читать о http://php.net/manual/en/function.flock.php – Dimi

Смежные вопросы