При загрузке новых фотографий на сервер Linux с PHP я должен дать им уникальные имена (использующий, это - имя файла, исключен). Нет никакого взаимодействия с DB, настолько добирающиеся уникальные идентификаторы также не возможны.
Я думал об использовании DATE+TIME.jpg, но это просто слишком длинно.
Таким образом, что лучший метод должен создать самые короткие уникальные имена с PHP?
Используйте tempnam().
$filename = tempnam ($dir, $prefix)
Она создает файл с уникальным именем в указанном каталоге. Создаваемое имя файла довольно короткое и гарантированно уникальное.
Создать индексный файл; этот файл содержит последний идентификатор, который использовался для файла. Когда необходимо создать новый файл:
с уважением,
Stijn
Проблема в том, что вам нужно что-то уникальное И короткое. Вы не можете иметь и то, и другое.
Самым плотным представлением случайного числа, удобочитаемым человеком, будет что-то вроде base64
(замените допустимые символы на любые символы, которых не должно быть в имени файла). Однако это все равно будет означать, что существует «всего» 64 варианта для каждого символа в имени файла.
Если вам нужно простое имя файла, просто используйте увеличивающееся число и закодируйте его в base64 (дополните его, если вы хотите минимальную длину имени). Если вы хотите, чтобы его нельзя было угадать, вам понадобится генератор случайных чисел, но тогда вам нужно избегать дублирования, иначе вы в конечном итоге перезапишете файл. Вероятность катастрофы тем выше, чем короче имена.
Вы, вероятно, могли бы использовать свой собственный эквивалент base64 с большим количеством символов, чем только 64, предоставленные этой кодировкой, но тогда вам нужно будет проверить, что ваша ОС считает допустимым именем файла, и вам все равно придется убедиться, что клиент может получить к нему надлежащий доступ (если это не просто временное хранилище данных). Самый простой способ сделать это - создать строку с каждым символом, в котором вы хотите быть законным, а затем преобразовать базу числа в любую длину строки (есть объяснения преобразования базы в Google, если вы не знаете как это сделать). Это позволило бы получить еще более высокую плотность информации и даже более короткие имена файлов.
Если На вашем месте я бы просто сгенерировал случайное число длиной около 6 символов и сделал бы в цикле do {} (while)
, пока оно не станет уникальным.
Кратчайший - не лучший способ. Я думаю, вы можете использовать функцию md5 ($ date + $ time), чтобы получить уникальное имя файла. Это будет так: 8d41627e46d5b8556d0d3e30ec15538e.
Кроме того, если вы думаете, что будет большое количество загруженных файлов, вы можете разделить структуру каталогов по папкам с именами, например, состоящими из первых двух букв хэша md5 ():
8d/
+ 8d41627e46d5b8556d0d3e30ec15538e.jpg
+ 8d897234ed899a523c88273c009c12c2.jpg
ce/
+ ce2389898ace097cc667e134abb61729.jpg
...
Вы можете использовать случайное число и схему дата+время и проверить, существует ли имя в цикле 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) увеличивает шанс найти уникальное имя для первого снимка...
Самый короткий безопасный способ - использовать функцию uniqid().
Вы также можете использовать хеширование того же типа, что и сокращатели URL-адресов, такие как bit.ly, для генерации своих уникальных 5-символьных имен папок (например, bit.ly/x3hs0
).
Один из способов - просто использовать случайные имена файлов. Например, rand (0,99999999) + ". Jpg"
.
Вероятность столкновения очень мала (если у вас мало изображений), и вы можете легко проверить, какой-то странный шанс, что имя уже занято и в таком случае получится новое.
Что я всегда делаю, так это задаю имя файла в виде MD5-хэша самого файла - побочным эффектом этого является то, что это позволяет избежать дублирования закачек, занимающих место, плюс вы можете довольно легко проверить целостность данных.
Если вы хотите, чтобы оно было короче, вы можете начать отрезать биты от конца, но чем больше вы это делаете, тем больше риск столкновения имен, но, по опыту, использование первых восьми или около того символов обычно гарантирует уникальность при условии, что вы не загружаете слишком много.