2010-02-25 3 views
6

При загрузке новых фотографий на сервер linux с PHP я должен предоставить им уникальные имена (исключая его имя файла). Там нет взаимодействия с БД, поэтому получение уникальных идентификаторов также невозможно.Как генерировать короткие имена файлов для загруженных фотографий?

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

Итак, какой лучший способ создать кратчайшие уникальные имена с помощью PHP?

ответ

8

Использование tempnam().

$filename = tempnam ($dir, $prefix) 

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

+0

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

0

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

0

Один из способов - просто использовать произвольные имена файлов. Мне нравится rand(0,99999999)+".jpg". Вероятность столкновения очень мала (если у вас нет БОЛЬШИХ изображений), и вы можете легко проверить, не произошло ли какое-то уродство, имя уже взято и получить новый в этом случае.

+0

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

2

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

There's an implementation in PHP here.

0

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

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

8d/ 
    + 8d41627e46d5b8556d0d3e30ec15538e.jpg 
    + 8d897234ed899a523c88273c009c12c2.jpg 
ce/ 
    + ce2389898ace097cc667e134abb61729.jpg 
... 
1

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

  1. заблокировать индексный файл (если ваша операционная система поддерживает его)
  2. Читать ID
  3. Добавить 1 к ID
  4. Сохранить файл
  5. Unlock файл
  6. Создайте файл с таким идентификатором

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

+0

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

+0

Правда; если вы этого не хотите, то просто использование увеличенных номеров не является вариантом. Хотя вы также можете увеличить его на 13, например, вместо 1; или добавить первую цифру текущего идентификатора, ... –

1

Ну, проблема в том, что вы хотите что-то уникальное и короткое. У вас не может быть и того, и другого.

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

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

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

3

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

0

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

$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 это короткое имя загружаемого файла

$ расширение является расширением вас файл (например, .jpg)

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

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

1

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

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

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