Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.60/25: Рейтинг темы: голосов - 25, средняя оценка - 4.60
-13 / 2 / 0
Регистрация: 14.08.2014
Сообщений: 240

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

04.11.2015, 03:46. Показов 5262. Ответов 31
Метки нет (Все метки)

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

Так как мы тут хардкорщики, я прошу вариант БЕЗ циклов. Слабо?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.11.2015, 03:46
Ответы с готовыми решениями:

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

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

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

31
16 / 16 / 10
Регистрация: 24.01.2014
Сообщений: 187
04.11.2015, 10:42
Ну вот например несколько вариантов
PHP
1
2
3
4
5
<?php
$filename = uniqid("", true).'.jpg';
$filename = time().'.jpg';
$filename = microtime(true).'.jpg';
?>
0
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,904
04.11.2015, 11:06
PHP
1
2
3
4
if(file_exists($file))
    // Генерируем заново
else
    // Сохраняем файл
0
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
04.11.2015, 17:22
А еще можно уникальное имя файла так задать:
Code
1
2
3
4
5
6
7
8
если создается первый файл
{
    имя = 0
}
иначе
{
    имя = имя последнего созданного файла + 1
}
Уникальность гарантируется, никаких коллизий.
0
-13 / 2 / 0
Регистрация: 14.08.2014
Сообщений: 240
04.11.2015, 17:58  [ТС]
Цитата Сообщение от WebProgrammer1 Посмотреть сообщение
Ну вот например несколько вариантов
PHP
1
2
3
4
5
<?php
$filename = uniqid("", true).'.jpg';
$filename = time().'.jpg';
$filename = microtime(true).'.jpg';
?>
WebProgrammer1, Стандартный, дедовский способ. Но что если в одну и ту же микросекунду загрузят больше одного файла?

Jodah, Интересно.
Насчёт логики, 1й пользователь загружает файл в микро 32 секунды, второй в 33.
Если в 32 кто то уже загрузил, добавляем 1, тогда тот кто в 33 загрузил, не будет иметь проблем и тоже тупо добавит 1
А если в 32 загрузили 5 пользователей? 1й назовёт файл 32, второй - 33, 3й - 33, 4й - 33, 5й - 33
А всё потому что нет цикла. Но как я и сказал он здесь и не нужен.

Так вот, это - тоже ведёт к возможности неожиданного результата.
Есть ли способ, при котором не возможно в принципе создать 2 одинаковых имени?

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

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

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

Добавлено через 21 минуту
Цитата Сообщение от pav1uxa Посмотреть сообщение
А еще можно уникальное имя файла так задать:
Code
1
2
3
4
5
6
7
8
если создается первый файл
{
    имя = 0
}
иначе
{
    имя = имя последнего созданного файла + 1
}
Уникальность гарантируется, никаких коллизий.
Вот это уже интересно.
Был файл 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 будет делать?
Зависнет? Выполнит по очереди? Выполнит их одновременно?
0
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,904
04.11.2015, 17:59
Лучший ответ Сообщение было отмечено AlexBitard как решение

Решение

AlexBitard, добавлять в БД, брать оттуда сгенерированный уникальный id и подставлять, тогда точно двух одинаковых не будет.
1
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
04.11.2015, 18:10
Цитата Сообщение от AlexBitard Посмотреть сообщение
Ну и если вам, ребята, слабо,
А Вам слабо 2 одинаковых файла в одну наносекунду загрузить?

Можно создать файла какой-нибудь пустой, с названием lock. И перед созданием файла, попробовать открывать его для записи. Если открылся - значит сейчас никто файл не создает, и можно создавать. Иначе - ждать пока будет доступен. Это 100% гарантия, но это уже перебор.
1
-13 / 2 / 0
Регистрация: 14.08.2014
Сообщений: 240
04.11.2015, 18:10  [ТС]
Jodah, Хорошо, но как ты себе это представляешь?
Для того что бы добавить 1 файл, мы проводим ряд стандартных мер что бы нам не подсунули чего, добавляем в БД БЕЗ уникального имени, id генерируется, мы ЧИТАЕМ эту запись, достаём id и апдейтим?
Если так, то ты конечно садист. Я бы с тобой не связывался. Мало ли что.
Но идея с идентификатором тоже хороша и я думал об этом.
Можно впринципе доставать id последней записи и прибавлять 1, не проще ли?
Но здесь я тоже чувствую, есть шанс непредвиденного выполнения. Какой, не знаю пока что. Думаю.

Эта мысль опять же толкает на вопрос
Как php обрабатывает запросы?
Пришло 2 запроса в одну и ту же долю секунды. Без единого различия, что php будет делать?
Зависнет? Выполнит по очереди? Выполнит их одновременно?
Но если здесь всё нормально, то возможно вариант с ($id+1).$random_line/microtime по настоящему уникален.
Ведь даже если рандомные строки или время сойдутся - id всегда уникальное значение.
0
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
04.11.2015, 18:10
Цитата Сообщение от AlexBitard Посмотреть сообщение
И я свободно вбиваю /upload/user_files/1(~99999999).jpg(ну или любой другой тип) и смотрю что выпадет.
Таким образом я могу шариться в файлах и мне удобно.
это уже полный бред. Зачем давать доступ тогда к этим файлам, если не хотите чтобы их видели?
0
-13 / 2 / 0
Регистрация: 14.08.2014
Сообщений: 240
04.11.2015, 18:16  [ТС]
Это 100% гарантия, но это уже перебор.
Согласен , это совсем уж жуткий хардкор.

Цитата Сообщение от pav1uxa Посмотреть сообщение
А Вам слабо 2 одинаковых файла в одну наносекунду загрузить?
Понимаю что шутка, но вдруг кто нибудь будет читать (из поисковиков придут например) и не поймёт.
Для них поясню, мы тут пытаемся найти способ генирации уникального имени, без даже крошечных шансов на неожиданный результат.

Даже при сверх огромных нагрузках и неадекватных пользователях любящих "погрузить".
0
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,904
04.11.2015, 18:22
Цитата Сообщение от AlexBitard Посмотреть сообщение
Для того что бы добавить 1 файл, мы проводим ряд стандартных мер что бы нам не подсунули чего, добавляем в БД БЕЗ уникального имени, id генерируется, мы ЧИТАЕМ эту запись, достаём id и апдейтим?
Если так, то ты конечно садист. Я бы с тобой не связывался. Мало ли что.
Почему нет? Не вижу ничего садистского.
Делаем insert, затем mysql_insert_id возвращает сгенерированный идентификатор, который можно использовать как имя.
0
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
04.11.2015, 18:24
Цитата Сообщение от AlexBitard Посмотреть сообщение
Понимаю что шутка, но вдруг кто нибудь будет читать (из поисковиков придут например) и не поймёт.
Для них поясню, мы тут пытаемся найти способ генирации уникального имени, без даже крошечных шансов на неожиданный результат.
Даже при сверх огромных нагрузках и неадекватных пользователях любящих "погрузить".
Ну я такой вариант предоставил. Подобные системы так и реализованы.
0
-13 / 2 / 0
Регистрация: 14.08.2014
Сообщений: 240
04.11.2015, 18:31  [ТС]
Цитата Сообщение от pav1uxa Посмотреть сообщение
это уже полный бред. Зачем давать доступ тогда к этим файлам, если не хотите чтобы их видели?
Нет, смотрите, вы общаетесь в ЛС на моём сайте с своей подругой.
Она показывает вам своё тело или кидает картинку ключа для активации игры в стиме.
Если имя файла следует закономерности и просто прибавляет 1 - я, интересующийся парнишка, возьму и пройдусь брутфорсом по сайту. Буду искать от 1, до 999999 .jpg например.
И что случится, знаете? Я найду приватное фото вашей подруги, которое предназначалось вам.
А потом найду картинку с ключём активации и активирую игру, которую вы решили отложить на потом.

А если бы имя файла было независимым, например ($id+1).microtime(true) я бы не смог его так вот запросто подобрать. Да и вообще не факт что смог бы подобрать.
А вы в свою очередь могли бы без проблем и опасений скопировать ссылку на изображение вашей подруги и отправить его приятелю или в модельное агенство и они не смогли бы заменив одну, две цифры посмотреть предудущие или следующие за этим изображения в вашей переписке.

Добавлено через 7 минут
Цитата Сообщение от Jodah Посмотреть сообщение
Почему нет? Не вижу ничего садистского.
Делаем insert, затем mysql_insert_id возвращает сгенерированный идентификатор, который можно использовать как имя.
Хорошо, если это так работает (не сарказм), то вы правы. Это тоже имеет право на жизнь.
Но скажите, не проще ли взять последний ID из БД и добавить 1?
Или ваша версия как то гарантирует то, что этот ID точно будет самым последним на момент добавления?
0
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
04.11.2015, 18:38
Цитата Сообщение от AlexBitard Посмотреть сообщение
Она показывает вам своё тело или кидает картинку ключа для активации игры в стиме.
Вначале Вы писали про уникальное имя. Никто не говорил о том что его нельзя будет подобрать. В таком случае то чего Вы хотите невозможно. Перебрать можно все что угодно. А фотографии можно показывать через скрипт, а папку в которой они лежат вообще закрыть. И в скрипте проверять - авторизован ли пользователь, и тот ли это пользователь кому предназначено фото. Я уже писал об этом выше, но видимо Вы не увидели.

Не по теме:

На самом деле то, о чем тут говорится, мало применимо в реальной жизни. Это просто болтология. Представьте себе метеорит с неба летит, а Вы погулять выходите. И он Вам на голову падает. Значит нам всем нужно срочно подумать и решить - что же сделать чтобы на 100% обезопасить себя от метеорита!? Может быть на улицу вообще не выходить? У кого какие варианты?

0
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,904
04.11.2015, 18:39
Цитата Сообщение от AlexBitard Посмотреть сообщение
гарантирует то, что этот ID точно будет самым последним
ID гарантированно будет уникальным.
0
-13 / 2 / 0
Регистрация: 14.08.2014
Сообщений: 240
04.11.2015, 18:54  [ТС]
Цитата Сообщение от pav1uxa Посмотреть сообщение
Вначале Вы писали про уникальное имя. Никто не говорил о том что его нельзя будет подобрать. В таком случае то чего Вы хотите невозможно. Перебрать можно все что угодно. А фотографии можно показывать через скрипт, а папку в которой они лежат вообще закрыть. И в скрипте проверять - авторизован ли пользователь, и тот ли это пользователь кому предназначено фото. Я уже писал об этом выше, но видимо Вы не увидели.

Не по теме:

На самом деле то, о чем тут говорится, мало применимо в реальной жизни. Это просто болтология. Представьте себе метеорит с неба летит, а Вы погулять выходите. И он Вам на голову падает. Значит нам всем нужно срочно подумать и решить - что же сделать чтобы на 100% обезопасить себя от метеорита!? Может быть на улицу вообще не выходить? У кого какие варианты?

Итак, представляю вам сайт которого не может существовать в реальной жизни, vk.com
Регистрация бесплатна, ссылки вида https://pp.vk.me/c628728/v6287... OUKpVg.jpg

Не по теме:

Магия, скажете вы, как заядлый скептик. "Вовсе нет", возражу я, "код написанный эксплуатируемыми смертными. Такими же как и мы с вами"



Так вот, в принципе я и сам уже показал вам, как добавить Вашему способу безопасности в плане подбора.

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

Добавлено через 8 минут
Цитата Сообщение от Jodah Посмотреть сообщение
ID гарантированно будет уникальным.
То есть логика вашего скрипта примерно следующая:
Удостоверившись в том что это нормальный файл, добавляем запись о нём в БД
Затем, извлекаем id из ячейки в которую записан файл (например это будет 72)
Для безопасности ссылки добавляем например рандомную строку (она будет у нас rg8qwj5y4h09)
Склеиваем имя файла $id.$rand_line.$rashirenie и записываем 72rg8qwj5y4h09.jpg в созданную ранее ячейку 72
Теперь мы имеем уникальный файл /upload/user_files/72rg8qwj5y4h09.jpg
Всё верно?
0
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
04.11.2015, 19:07
Цитата Сообщение от AlexBitard Посмотреть сообщение
Итак, представляю вам сайт которого не может существовать в реальной жизни, vk.com
Регистрация бесплатна, ссылки вида https://pp.vk.me/c628728/v6287... OUKpVg.jpg
Цитата Сообщение от AlexBitard Посмотреть сообщение
Магия, скажете вы, как заядлый скептик.
Ну конечно магия. Зная URL-адрес картинки можно скинуть ее куда угодно, на форум например, и любой сможет посмотреть, даже без регистрации.
А еще совсем недавно вконтакте закрытые альбомы можно было просматривать, даже если Вы не в друзьях у человека.
Действительно магия.
0
-13 / 2 / 0
Регистрация: 14.08.2014
Сообщений: 240
04.11.2015, 19:21  [ТС]
Цитата Сообщение от pav1uxa Посмотреть сообщение
А еще совсем недавно вконтакте закрытые альбомы можно было просматривать, даже если Вы не в друзьях у человека.
Интересная связь между генирацией уникального имени файла и этой информацией. Вы определённо сечёте!
0
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
04.11.2015, 20:17
Цитата Сообщение от AlexBitard Посмотреть сообщение
Интересная связь между генирацией уникального имени файла и этой информацией. Вы определённо сечёте!

Не по теме:

Такая же как и связь фото девушки с уникальностью имени файла.

0
-13 / 2 / 0
Регистрация: 14.08.2014
Сообщений: 240
04.11.2015, 21:18  [ТС]

Не по теме:

А, так у вас девушки нет что ли? Если так, я уверяю - не хотел обидеть как либо в этом плане.
Да и вовсе они не обязательны. Попробуйте дружеские отношения. Свобода это удобно!


Jodah, только узнал о insert_id - великолепная штука!
Всего 14 символов позволили за пол минуты добавить удобства и вывести ссылку "К материалу" при добавлении новости.
И да, ссылка действительно в этом случае получится уникальной. Создать вторую такую же - не возможно.

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

У меня есть всего 1 вопрос, как вставлять имя файла в таблицу?
Какой алгоритм?
- Создали ячейку в таблице files (пустую и зануленную? ну кроме естественно поля from указывающее на то для чего этот файл нужен. Для какой новости например)
- Всё, у нас есть ID, теперь апдейтим ячейку name нужными данными?

Или можно как то всё в одно действие сделать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.11.2015, 21:18
Помогаю со студенческими работами здесь

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

Как назначить иконку динамически скомпилированному exe-файлу
Добрый день!! Возник вопрос, я пишу билдер. Все ок Суть : пользователь хочет создать программу с помощью моего билдера, и должен...

Как назначить имя новой переменной в new
Здравствуйте, 1)Функция должна создавать новый объект структуры. struct Wagen { int weight;; char clas; }; Функция: void...

Уникальное имя
Здравствуйте, есть поле группа в таблице, длина которого может составлять 64 символа. Нужно, чтоб все названия групп были разными. Стоит ли...

Дано полное имя файла, т.е путь к файлу, имя и расширение. Выделить из строки только имя первого католога
Помогите пожалуйста!!! Залание: Дано полное имя файла, т.е путь к файлу, имя и расширение. Выделить из строки только имя первого...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru