php случайное имя файла

Генерация уникального имени файла в PHP проектах

php случайное имя файла. Смотреть фото php случайное имя файла. Смотреть картинку php случайное имя файла. Картинка про php случайное имя файла. Фото php случайное имя файла

C самых первых проектов, поддерживающих загрузку файлов на сервер, любой программист сталкивается с необходимостью генерации уникальных случайных имён для загруженных файлов. Рассмотрим несколько вариантов решения данной проблемы.

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

Самый лёгкий вариант – это использование встроенной в PHP функции uniqid():

Эта функция вернёт случайную 13-символьную строку. Если же нужно делать имена длиннее, то можно использовать функции вычисления хэша от случайной строки:

Функция md5() генерирует 32-символьную строку. Можно, конечно использовать любую другую функцю. При желании можно установить любую длину от 1 до 32 обрезав md5-хэш функцией substr() :

Если нужно хранить файл с расширением, то его расширение можно легко приписывать к идентификатору:

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

Чтобы избежать перезаписи нам необходимо проверять папку на отсутствие такого же файла. Напишем функцию, избавленную от этого недостатка:

Рассмотрим пример загрузки изображения с использованием данной функции:

С помощью функции DFileHelper::getRandomFileName() мы генерируем уникальное имя файла для папки upload/images и используем это имя для загрузки. Теперь файлы никогда не перезапишутся, так как имена никогда не совпадут.

Не пропускайте новые статьи, бонусы и мастер-классы:

php случайное имя файла. Смотреть фото php случайное имя файла. Смотреть картинку php случайное имя файла. Картинка про php случайное имя файла. Фото php случайное имя файла

Как многим известно, для хранения настроек приложения в Yii выделен специальный раздел `params` в конфигурационном файле. Это решение достаточно простое, но оно не позволяет легко менять настройки самому пользователю в панели управления сайта. Очередной вопрос на русском форуме Yii натолкнул меня поделиться своим вариантом решения упомянутого там вопроса.

php случайное имя файла. Смотреть фото php случайное имя файла. Смотреть картинку php случайное имя файла. Картинка про php случайное имя файла. Фото php случайное имя файла

В комментариях к записи о HTML Purifier был задан вопрос о том, каким образом можно переделать внешние адреса на переход через промежуточную страницу на своём сайте. Сделаем функционал, обрабатывающий внешние ссылки в тексте и переадресующий их на страницу подтверждения перехода на другие сайты.

php случайное имя файла. Смотреть фото php случайное имя файла. Смотреть картинку php случайное имя файла. Картинка про php случайное имя файла. Фото php случайное имя файла

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

php случайное имя файла. Смотреть фото php случайное имя файла. Смотреть картинку php случайное имя файла. Картинка про php случайное имя файла. Фото php случайное имя файла

В процессе работы с фреймворком часто приходится запрашивать у моделей всевозможные массивы (для генерации меню, для выпадающих списков в формах поиска или редактирования сущностей), а также находить нужную категорию по составному пути.

С микротаймом и мд5, коллизии никогда не будет по 1 простой причине 🙂
В одной папке есть лимит количества файлов, после которого просто система заглохнет читать папку, а удалять файлы в такой папке будет пыткой даже для СИшных приложений и будет очень дорогостоящей операцией для системы.

Увы, но это не причина.

Не знаю, правильно, или нет, но так в одной папке много не скопится 🙂

И такой вопрос: а если надо сохранить имена файлов (ещё и на русском языке)? Сервер корёжит имена при загрузке.

Да, кстати, лучше создавать папки по дате. Так многие CMS делают (тот же WordPress).

И касательно имён: можно хранить имя в ещё одной ячейке, а файлы отдавать через x-sendfile в Nginx с передачей оригинального имени.

Я делал проще с использованием TIME():

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

Увы, эта функция не припишет к имени файла расширение. После конкатенации расширения её также придётся оборачивать в этот же цикл do-while.

И зачем ему расширение?

Очень прошу, поменяйте хотя бы для первых блоков (с uniqid и md5(microtime)) описание, допишите, что этот способ использовать _нельзя_. Ну открывают же и копируют, не глядя.

А Вы изображения без расширений загружаете?

В Yii2 есть методы:

Для тех кто не любит MD5.

Посмотрел на код нашего юниора, который использует эту замечательную статью, вскрылся очередной косяк:

// ВОТ ТУТ ДРУГОЙ ПРОЦЕСС СОЗДАЕТ ФАЙЛ С ТАКИМ ЖЕ ИМЕНЕМ

Слушайте, ну уберите статью, ну пожалуйста. Она не имеет абсолютно никакого смысла и только запутывает людей. Пожалуйста, посмотрите в исходниках PHP, как работает tempnam (подсказка: через mkstemp), посмотрите, что такое mkstemp и как она отличается от mktemp. В качестве бонуса попробуйте осознать понятия «атомарность» и «параллельное выполнение».
Ваша статья в гугле висит на первых местах и несёт страдание в этот мир.

Да запросто. Если подскажете, как сгенерировать случайное имя с расширением – удалю.

Переработал ещё позавчера.

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

Нет. Наоборот. Это цикл while, а не until.

В этой ситуации может произойти такое, что и для Клиента1, и для Клиента2 будет создано одно и тоже «уникальное» имя, но Клиент2 не узнает об этом, поскольку Клиент1 еще не произвел запись файла в каталог, а ведь лишь после этого метод file_exists() сможет определить, что файл с таким именем уже существует в директории.

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

Сейчаc от этого спасает только rand(0, 9999) в имени, что даёт крайне малую верятность этого события:

Можно повысить верхний предел до миллиона, что снизит возможность совпадения до одной миллионной.

Но всё равно создание пустого файла не спасёт, так как это «сразу же» тоже не будет мгновенным.

А разве так не надежнее будет?

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

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

Вопрос, какова вероятность перезаписи файла в моем случаи, я хеш не обрезаю вообще

Источник

PHP: как создать случайную, уникальную, буквенно-цифровую строку?

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

Как я могу создать один из них с помощью PHP?

24 ответов:

Примечание: это решение не должно использоваться в ситуациях, когда качество ваших случайность может повлиять на безопасность приложения. В частности, rand() и uniqid() не криптографически безопасный генератор случайных чисел!—9—>. Смотрите Скотт для безопасной альтернативы.

Если вам не нужно, чтобы он был абсолютно уникальным с течением времени:

в противном случае (учитывая, что вы уже определили уникальный логин для вашего пользователя):

я просто изучал, как решить эту же проблему, но я также хочу, чтобы моя функция создавала токен, который можно использовать для поиска пароля. Это означает, что мне нужно ограничить способность маркера угадывать. Потому что uniqid основано на времени, и согласно php.net » возвращаемое значение немного отличается от microtime ()», uniqid не соответствует критериям. В PHP рекомендует использовать openssl_random_pseudo_bytes() вместо того, чтобы генерировать криптографически безопасный жетоны.

быстрый, короткий и по существу ответ:

Ниже приведена самая сильная функция, которую я мог бы сделать, которая удовлетворяет критериям (это реализованная версия ответа Эрика).

объектно-ориентированная версия самого популярного решения

Я создал объектно-ориентированное решение, основанное на Скотт‘ы ответ:

использование

пользовательские алфавит

при необходимости вы можете использовать пользовательский алфавит. Просто передайте строку с поддерживаемыми символами конструктору или сеттеру:

вот выходные образцы

Я надеюсь, что это поможет кто-то. Ура!

эта функция генерирует случайный ключ, используя цифры и буквы:

Я опаздываю, но я здесь с некоторыми хорошими исследовательскими данными, основанными на функциях, предоставляемых Скотт. Поэтому я настроил цифровую каплю океана только для этого 5-дневного автоматизированного теста и сохранил сгенерированные уникальные строки в базе данных MySQL.

в этот период я использовал 5 различных длин (5, 10, 15, 20, 50) и +/-0.5 млн записей были вставлены для каждой длины. Во время моего теста только длина 5 сгенерированных +/-3K дубликатов из 0.5 миллионов и остальные длины не создавали никаких дубликатов. Таким образом, мы можем сказать, что если мы используем длину 15 или выше с функциями Скотта, то мы можем генерировать высоконадежные уникальные строки. Вот таблица с данными моих исследований:

php случайное имя файла. Смотреть фото php случайное имя файла. Смотреть картинку php случайное имя файла. Картинка про php случайное имя файла. Фото php случайное имя файла

Я надеюсь, что это помогает.

вы можете использовать UUID (универсальный уникальный идентификатор), его можно использовать для любых целей, от строки аутентификации пользователя до идентификатора платежной транзакции.

UUID-это 16-октетное (128-битное) число. В своей канонической форме UUID представлен 32 шестнадцатеричными цифрами, отображаемыми в пяти группах, разделенных дефисами, в виде 8-4-4-4-12 в общей сложности 36 символов (32 буквенно-цифровых символа и четыре дефиса).

некоторые примеры вывода будут выглядеть так:

надеюсь, что это поможет кому-то в будущем 🙂

где length-длина нужной строки (делится на 4, в противном случае она округляется до ближайшего числа, делящегося на 4)

например (в псевдокоде)

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

вот окончательный уникальный генератор id для вас. сделано мной.

мне нравится использовать хэш-ключи при работе с проверочными ссылками. Я бы рекомендовал использовать microtime и хэширование, используя MD5, поскольку не должно быть причин, по которым ключи должны быть одинаковыми, поскольку он хэшируется на основе microtime.

Скотт, да ты сам пишешь и хорошее решение! Спасибо.

Я также должен генерировать уникальный маркер API для каждого моего пользователя. Ниже приведен мой подход, я использовал информацию о пользователе (Userid и имя пользователя):

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

после прочтения предыдущих примеров я придумал следующее:

я дублирую 10 раз массив[0-9, A-Z] и перемешиваю элементы, после того как я получаю случайную начальную точку для substr (), чтобы быть более «творческим» 🙂 вы можете добавить [a-z] и другие элементы в массив, дублировать более или менее, быть более творческим, чем я

вот что я использую на одном из моих проектов, он работает и генерирует УНИКАЛЬНЫЙ СЛУЧАЙНЫЙ ТОКЕН:

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

Я думаю, что это лучший способ использовать.

выше функция будет генерировать вам случайную строку длиной 11 символов.

мы можем использовать эти две строки кода для создания уникальной строки проверили около 10000000 раз итерации

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

поэтому, даже если вы попытаетесь создать строку несколько раз в одно и то же время, вы получите разные выходные данные.

Это простая функция, которая позволяет генерировать случайные строки, содержащие буквы и цифры (буквенно-цифровой). Вы также можете ограничить длину строки. Эти случайные строки могут быть использованы для различных целей, в том числе: реферальный код, промокод, код купона. Функция опирается на следующие функции PHP: base_convert, sha1, uniqid, mt_rand

Я считаю, что проблема со всеми существующими идеями заключается в том, что они наверное уникальный, но не наверняка уникальный (как указано в ответе Дариуша Вальчака на loletech). У меня есть решение, которое на самом деле является уникальным. Это требует, чтобы ваш скрипт имел какую-то память. Для меня это база данных SQL. Вы также можете просто написать в файл где-нибудь. Есть две реализации:

Первый метод: есть два поля, а не 1, которые обеспечивают уникальность. Первое поле-это идентификационный номер, который не является случайным, но является уникальным (первый идентификатор-1, второй-2. ). Если вы используете SQL, просто определите поле ID со свойством AUTO_INCREMENT. Второе поле не является уникальным, но случайным. Это может быть создано с помощью любого из других методов, которые люди уже упоминали. Идея Скотта была хороша, но md5 удобен и, вероятно, достаточно хорош для большинства целей:

Второй метод: в основном та же идея, но изначально выберите максимальное количество строк, которые когда-либо будут созданы. Это может быть просто очень большое число, как триллион. Затем сделайте то же самое, сгенерируйте идентификатор, но обнулите его так, чтобы все идентификаторы имели одинаковое количество цифр. Затем просто объедините идентификатор со случайной строкой. Это будет достаточно случайным для большинства целей, но раздел ID гарантирует, что он также уникален.

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

Источник

Как назначить уникальное имя файлу?

Задаю уникальное имя файла при помощи md5($id_будущего_файла_в_таблице.microtime(true));
Какова вероятность повторения md5 хэша? Я понимаю что крайне и крайне мала, но всё же.
И что посоветуете вместо md5? Сразу скажу, насколько я знаю, ЛЮБОЙ тип хэширования допускает коллизии.
И вообще, если хэшировать строку в данном случае глупо, предлагайте свои версии того, как назначить уникальное имя для файла, БЕЗ единого шанса на повторение.

Так как мы тут хардкорщики, я прошу вариант БЕЗ циклов. Слабо?

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Уникальное имя файла
Написал скрипт загрузки файла на сервер с последующим перемещением из временной папки на мой.

Как сделать проверку на уникальное имя процесса
Ребят, помогите! Вот код: package processcheker; import java.io.BufferedReader; import.

php случайное имя файла. Смотреть фото php случайное имя файла. Смотреть картинку php случайное имя файла. Картинка про php случайное имя файла. Фото php случайное имя файлаПередать имя файла в переменную, если имя каждый раз уникальное и содержит маску
Добрый день. В виду отсутствия информации в поиске, прошу помочь с вопросом по batch. Как.

Как назначить иконку исполняемому файлу приложения
Как в visual basic поставить иконку exe файлу, что бы не у ярлыка, а самого exe файла была иконка.

WebProgrammer1, Стандартный, дедовский способ. Но что если в одну и ту же микросекунду загрузят больше одного файла?

Если нет, то есть ли хотя бы нано таймер?
Ну и если вам, ребята, слабо, буду использовать циклы при повторении имени.
Только подскажите какой лучше, while?

И если сейчас php такого не умеет, скажите, как логичнее преобразовывать имя файла загруженного в то же время? Прибавить 1 единицу времени? Добавить рандомный символ?

Но я всё же надеюсь что кто то скажет как дать абсолютно уникальное и неповторимое имя.

Добавлено через 21 минуту

Вот это уже интересно.
Был файл pisun_tryasun1234
Загружаем файл «Моя звезда», и техническое имя файла pisun_tryasun12341
Следующий файл pisun_tryasun123411

Если это делать цифрами, например текущий последний файл 54, следующий 55, потом 56, но это позволяет всем проходящим мимо открывать любой пользовательский файл без каких либо проблем.

Например я знаю что все файлы хранятся в папке /upload/user_files
И я свободно вбиваю /upload/user_files/1(

99999999).jpg(ну или любой другой тип) и смотрю что выпадет.
Таким образом я могу шариться в файлах и мне удобно.

Концепция неплохая, это действительно уникальное имя будет. Всегда! Даже если в одну и ту же нано секунду были отправлены запросы, чей то обработается первее, имя файла задастся, а имя следующего файла будет отталкиваться от предыдущего загруженного. Очень даже неплохо.
Только конечно при условии что php не способен обработать 2 абсолютно одновременно пришедших запроса.
Тогда они оба получили бы одно и то же имя. Что вообще вызвало бы крах всей логики.
Но насчёт этого я ничего незнаю и утверждать не берусь. Поверю на слово.

Можно ли как нибудь эту концепцию применить безопасно?
На уме только +1.$rand_line_long_8 но тогда имена файлов выглядели бы странновато конечно XD
1e8r79gt92n
223r7t68g31
3w34yoier9y
4rfsdnrhtiog
5sdkltjm4tt0

Ну или не рандомную строку, а как раз microtime(true).
Какие мысли насчёт имени и что важнее всего, что насчёт обработки данных php?

Интересно уж очень стало насчёт того как php обрабатывает запросы.
Пришло 2 запроса в одну и ту же долю секунды. Без единого различия, что php будет делать?
Зависнет? Выполнит по очереди? Выполнит их одновременно?

Источник

Как использовать пространства имен в PHP, Часть 1: Основы

php случайное имя файла. Смотреть фото php случайное имя файла. Смотреть картинку php случайное имя файла. Картинка про php случайное имя файла. Фото php случайное имя файла

Предисловие: На Хабре уже публиковались несколько статей, посвященных пространству имен в PHP (все ссылки на них я привожу в приложении). Однако, этот интересный и полезный вопрос был раскрыт не полностью. Поэтому я привожу перевод первой из трех статей по данной теме (остальные переведу в ближайшее время). P.S. Статья для начинающих

Пространства имен (namespaces) — это одно из самых значительных изменений в PHP 5.3. Они будут хорошо знакомы С# и Java разработчикам, и, вероятно, они изменят к лучшему структуру PHP-приложений.

Почему мы нуждаемся в пространстве имен?

Поскольку размер библиотеки Вашего PHP кода растет, возрастает и риск случайного переопределения функции или имени класса, которые были объявлены ранее. Проблема усугубляется, когда Вы пытаетесь добавлять сторонние компоненты или плагины; что будет, если два или более наборов кода будут выполнять классы «Database» или «User»?

Ранее, единственным решением были длинные имена классов/функций. Например, WordPress добавлял к каждому имени префикс «WP_». Zend Framework обычно дает детально описывающие названия, что приводит к длиннющим именам классов, таким как Zend_Search_Lucene_Analysis_Analyzer_Common_Text_CaseInsensitive.

Проблемы совпадения имен снимаются введением пространств имен. PHP константы, классы и функции могут быть сгруппированы в библиотеки пространств имен (namespaced libraries).

Как определяются пространства имен?

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

В коде, пространства имен определяются с помощью единственного слова namespace в самом начале Вашего PHP файла. Это слово должно быть самой первой командой (за исключением declare) и ни не-PHP код, ни HTML, ни даже пробел не должен предшествовать этой команде, например:

Весь код, следующий за этими строками, будет относиться к пространству имен «MyProject». Невозможно вкладывать в него другие пространства имен, или определять более чем одно пространство имен для одной и той же части кода (поскольку распознано будет лишь последнее объявление пространства имен, предшествующие же — игнорируются). Тем не менее, Вы можете определить различные пространства имен в одном и том же файле, например:

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

Подпространства имен (Sub-namespaces)

Вызов кода, относящегося к пространству имен

В файле с именем lib1.php мы определим константу, функцию и класс в пределах пространства имен App\Lib1:

lib1.php

Теперь мы можем включить этот код в другой PHP файл, например:

myapp.php

Никаких пространств имен не определено в файле myapp.php, поэтому код существует в глобальном пространстве. Любая прямая ссылка на MYCONST, MyFunction или MyClass вызовет сбой, поскольку они существуют только в пространстве имен App\Lib1. Чтобы вызвать код из lib1.php, мы можем добавить префикс \App\Lib1, чтобы определить полное квалифицированное имя. На выходе, когда загрузим myapp.php, мы получим следующий результат:

Полные квалифицированные имена могут становиться достаточно длинными; вместе с тем, существует несколько очевидных преимуществ в определении длинных имен классов, наподобие App-Lib1-MyClass. Поэтому, в следующей статье, мы обсудим использование псевдонимов (aliasing) и разберемся как PHP разрешает имена пространств имен.

Источник

Генерация случайных буквенно-цифровых строк в PHP

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

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

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

Генерация случайных чисел в PHP

Функция стала еще лучше в PHP 7.2.0, избавившись от ошибки смещения по модулю. Это означает, что для некоторых конкретных семян ваша последовательность случайных чисел теперь будет немного лучше по сравнению со старыми версиями. Тем не менее, некоторый специализированный код может действительно полагаться на это смещение Если это так, вы можете использовать более старый начальный алгоритм, вызвав mt_srand() для MT_RAND_PHP генератора случайных чисел и передав MT_RAND_PHP в качестве значения второго параметра.

В приведенной выше последовательности у нас было 1267 дважды на выходе, но это не значит, что вся последовательность начала повторяться после этого. Маловероятно, что такое же число будет повторяться так скоро в случайной последовательности, но это возможно!

Криптографически безопасные случайные целые числа

Случайные числа

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *