Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: Уникальное имя для файла  (Прочитано 3229 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн iormark

  • Автор темы
  • Любитель
  • *
  • Сообщений: 56
    • Просмотр профиля
Уникальное имя для файла
« : 13 Декабрь 2011, 17:55:27 »
Здравствуйте, мне необходимо присваивать каждому закаченному изображению на сайт
уникальный идентификатор, как такое можно сделать, может полагаться на время или..?

Оффлайн Vitsliputsli

  • Старожил
  • *
  • Сообщений: 1293
    • Просмотр профиля
Re: Уникальное имя для файла
« Ответ #1 : 13 Декабрь 2011, 18:14:31 »
а почему бы и нет? например
date +%s   
%s - число секунд, истёкших с 1970-01-01 00:00:00 UTC
если закачки происходят чаще чем раз в секунду можно добавить и наносекунды:
date +%s%N

Оффлайн ArcFi

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Re: Уникальное имя для файла
« Ответ #2 : 13 Декабрь 2011, 19:32:04 »
$ echo $RANDOM$RANDOM
27866397

$ pwgen -sn 20 1
59uYePRRrjYwKFSh9gM5

Оффлайн iormark

  • Автор темы
  • Любитель
  • *
  • Сообщений: 56
    • Просмотр профиля
Re: Уникальное имя для файла
« Ответ #3 : 13 Декабрь 2011, 19:47:48 »
ооо спасибище)))а
$RANDOM$RANDOM наверняка повторится когда нибудь?

Оффлайн ArcFi

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Re: Уникальное имя для файла
« Ответ #4 : 13 Декабрь 2011, 19:49:47 »
$RANDOM$RANDOM наверняка повторится когда нибудь?
$RANDOM$RANDOM$RANDOM$RANDOM$RANDOM$RANDOM... =]

Оффлайн iormark

  • Автор темы
  • Любитель
  • *
  • Сообщений: 56
    • Просмотр профиля
Re: Уникальное имя для файла
« Ответ #5 : 13 Декабрь 2011, 19:58:58 »
$RANDOM$RANDOM$RANDOM$RANDOM$RANDOM$RANDOM... =]
а вдруг?))) не луче data)) а вот,

$ pwgen -sn 20 1
59uYePRRrjYwKFSh9gM5

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

Оффлайн Vitsliputsli

  • Старожил
  • *
  • Сообщений: 1293
    • Просмотр профиля
Re: Уникальное имя для файла
« Ответ #6 : 13 Декабрь 2011, 20:05:19 »
нумеруйте последовательно, 1, 2 и т.д.

Оффлайн hippi90

  • Активист
  • *
  • Сообщений: 433
    • Просмотр профиля
Re: Уникальное имя для файла
« Ответ #7 : 13 Декабрь 2011, 20:06:15 »
Если у вас все картинки разные, то можно в качестве имени подставлять хеш файла, а если для двух файлов хеш совпадает, значит файлы одинаковые, и смысла хранить две копии одного файла нет.

Оффлайн ArcFi

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Re: Уникальное имя для файла
« Ответ #8 : 13 Декабрь 2011, 20:11:31 »
вдруг тоже повторится
Хорошие программы/скрипты отличаются тем, что учитывают много всяких "если" и "вдруг".
Перед использованием стоит проверить, свободно ли имя.

Оффлайн iormark

  • Автор темы
  • Любитель
  • *
  • Сообщений: 56
    • Просмотр профиля
Re: Уникальное имя для файла
« Ответ #9 : 13 Декабрь 2011, 21:08:32 »
это точно, спасибо)

Оффлайн unimix

  • Активист
  • *
  • Сообщений: 537
    • Просмотр профиля
Re: Уникальное имя для файла
« Ответ #10 : 13 Декабрь 2011, 21:14:23 »
нумеруйте последовательно, 1, 2 и т.д.
а если для двух файлов хеш совпадает, значит файлы одинаковые, и смысла хранить две копии одного файла нет.
Перед использованием стоит проверить, свободно ли имя.

Всё упирается в организацию хранения файлов на сайте.

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

На всяк случай, ели сайт на PHP, то не советую использовать shell для генерации имени. Думаю, это и так понятно.

Оффлайн MooSE

  • Старожил
  • *
  • Сообщений: 1027
    • Просмотр профиля
Re: Уникальное имя для файла
« Ответ #11 : 14 Декабрь 2011, 02:01:41 »
Я вот тут: http://www.ylsoftware.com/news/633 описывал своё решение.

Копипаста:

        // Получаем временную метку
        $current_timestamp = time();
        // Конвертируем её в 36-разрядную систему счисления
        $current_timestamp_36 = base_convert($current_timestamp, 10, 36);

        // Вычисляем директорию для заливки
        $dir_name = 'data/' . substr($current_timestamp_36 , 0, 2) . '/' . $current_timestamp_36;

        // Создаём директорию
        @mkdir($dir_name, 0777, TRUE);

        // Вычисляем имя файла
        $target_path = $dir_name . '/' . basename($_FILES['file']['name']);

        // пытаемся переместить
        if(@move_uploaded_file($_FILES['file']['tmp_name'], $target_path)) {

Оффлайн unimix

  • Активист
  • *
  • Сообщений: 537
    • Просмотр профиля
Re: Уникальное имя для файла
« Ответ #12 : 14 Декабрь 2011, 03:36:58 »
Я вот тут: http://www.ylsoftware.com/news/633 описывал своё решение.

Решение не больше, чем создавать директории по секундам. Также, это плохое решение с точки безопасности. Если предполагается загрузка картинки, то проверяйте хоть расширение загруженных файлов.
« Последнее редактирование: 14 Декабрь 2011, 05:54:06 от unimix »

Оффлайн iormark

  • Автор темы
  • Любитель
  • *
  • Сообщений: 56
    • Просмотр профиля
Re: Уникальное имя для файла
« Ответ #13 : 14 Декабрь 2011, 11:58:05 »
Вообще по поводу безопасности, то у меня только скрипт закачивает картинки, т.е всё в одном потоке работать будет)

Хотелось бы присваивать картинкам такие имена

$ pwgen -sn 20 1
59uYePRRrjYwKFSh9gM5

только как проверять занятость имени, один раз и так можно

Код: (bash) [Выделить]
i=`pwgen -sn 20 1`".jpg"
if [ -r $i ]; then
     i=`pwgen -sn 20 1`".jpg"
fi

еслиб рекурсивно?

Оффлайн unimix

  • Активист
  • *
  • Сообщений: 537
    • Просмотр профиля
Re: Уникальное имя для файла
« Ответ #14 : 14 Декабрь 2011, 12:36:21 »
Проверка свободного имени в цикле:
Код: (bash) [Выделить]
i=`pwgen -sn 20 1`".jpg"
while [ -f $i ]; do
   i=`pwgen -sn 20 1`".jpg"
done

 

Страница сгенерирована за 0.086 секунд. Запросов: 25.