Как генерировать короткие имена файлов для загруженных фотографий?

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

Я думал об использовании DATE+TIME.jpg, но это просто слишком длинно.

Таким образом, что лучший метод должен создать самые короткие уникальные имена с PHP?

6
задан Yeti 25 February 2010 в 09:18
поделиться

10 ответов

Используйте tempnam().

$filename = tempnam  ($dir, $prefix)

Она создает файл с уникальным именем в указанном каталоге. Создаваемое имя файла довольно короткое и гарантированно уникальное.

8
ответ дан 8 December 2019 в 14:42
поделиться

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

  1. заблокируйте индексный файл (если ваша ОС поддерживает)
  2. Прочтите идентификатор
  3. Добавьте 1 к идентификатору
  4. Сохраните файл
  5. Разблокируйте файл
  6. Создайте файл с этим идентификатором

с уважением,
Stijn

1
ответ дан 8 December 2019 в 14:42
поделиться

Проблема в том, что вам нужно что-то уникальное И короткое. Вы не можете иметь и то, и другое.

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

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

Вы, вероятно, могли бы использовать свой собственный эквивалент base64 с большим количеством символов, чем только 64, предоставленные этой кодировкой, но тогда вам нужно будет проверить, что ваша ОС считает допустимым именем файла, и вам все равно придется убедиться, что клиент может получить к нему надлежащий доступ (если это не просто временное хранилище данных). Самый простой способ сделать это - создать строку с каждым символом, в котором вы хотите быть законным, а затем преобразовать базу числа в любую длину строки (есть объяснения преобразования базы в Google, если вы не знаете как это сделать). Это позволило бы получить еще более высокую плотность информации и даже более короткие имена файлов.

1
ответ дан 8 December 2019 в 14:42
поделиться

Если На вашем месте я бы просто сгенерировал случайное число длиной около 6 символов и сделал бы в цикле do {} (while) , пока оно не станет уникальным.

0
ответ дан 8 December 2019 в 14:42
поделиться

Кратчайший - не лучший способ. Я думаю, вы можете использовать функцию md5 ($ date + $ time), чтобы получить уникальное имя файла. Это будет так: 8d41627e46d5b8556d0d3e30ec15538e.

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

8d/
  + 8d41627e46d5b8556d0d3e30ec15538e.jpg
  + 8d897234ed899a523c88273c009c12c2.jpg
ce/
  + ce2389898ace097cc667e134abb61729.jpg
...
0
ответ дан 8 December 2019 в 14:42
поделиться

Вы можете использовать случайное число и схему дата+время и проверить, существует ли имя в цикле while() :

$new_name = md5( rand(0,99999) . date('Ymd') . microtime(true) ) . $extension;
while ( file_exists($path . $new_name) ) 
   $new_name = md5( rand(0,99999) . date('Ymd') . microtime(true) ) . $extension;

где $new_name - короткое имя загруженного файла

$extension - расширение вашего файла (например, . jpg)

$path - полный путь к директории, в которой должен быть сохранен файл

Использование rand() плюс microtime(true) увеличивает шанс найти уникальное имя для первого снимка...

0
ответ дан 8 December 2019 в 14:42
поделиться

Самый короткий безопасный способ - использовать функцию uniqid().

3
ответ дан 8 December 2019 в 14:42
поделиться

Вы также можете использовать хеширование того же типа, что и сокращатели URL-адресов, такие как bit.ly, для генерации своих уникальных 5-символьных имен папок (например, bit.ly/x3hs0 ).

Здесь есть реализация на PHP .

2
ответ дан 8 December 2019 в 14:42
поделиться

Один из способов - просто использовать случайные имена файлов. Например, rand (0,99999999) + ". Jpg" . Вероятность столкновения очень мала (если у вас мало изображений), и вы можете легко проверить, какой-то странный шанс, что имя уже занято и в таком случае получится новое.

0
ответ дан 8 December 2019 в 14:42
поделиться

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

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

1
ответ дан 8 December 2019 в 14:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: