Какой хороший способ генерировать короткие и уникальные имена файлов / папок? - PullRequest
3 голосов
/ 01 мая 2009

Критерии в основном таковы:

  • папки будут существовать около 24-48 часов
  • имена папок не могут быть легко угаданы пользователем (если используется в URL)
  • имена папок должны быть короткими 5-15 символами

Начальные мысли:

printf('%u',crc32(microtime(true)));

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

Ответы [ 8 ]

6 голосов
/ 01 мая 2009

[Изменить] Подождите секунду. PHP включает в стандартную библиотеку уникальную функцию генератора идентификаторов . Есть другие подходы тоже.

1 голос
/ 01 мая 2009

Классическая техника выглядит примерно так

  + uploader-name  
    + 20090401
      + 010000     // hhmmss
      + 013000     // hhmmss
      + 014500     // hhmmss
    ...

    + 20090402

добавление уровней, добавление "a", "b", "c", ... и т. Д. В зависимости от желаемой степени детализации.

Это работает, особенно хорошо, если пользователь относится к файлам вообще в хронологическом порядке.

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

Если вы так склонны, вы можете украсить выражения даты - «2009-апр-01», «01:45 AM» и т. Д.

0 голосов
/ 01 июня 2009

Стандарт C ++ имеет функции tmpfile и tmpnum как в cstdio (stdio.h), так и создает временный файл и временное имя файла соответственно. Тем не менее, tmpfile удаляется в конце программы. Я бы связал их, но, к сожалению, пока не могу опубликовать ссылки.

0 голосов
/ 01 мая 2009

Основываясь на хэше (или md5, или на шаре), можно предположить, что пользователь примерно знает, когда создается каталог. Все, что им нужно сделать, - это установить простой скрипт, чтобы сгенерировать все возможности, охватываемые несколькими секундами с обеих сторон, а затем перейти на сайт в поисках ответа. Добавление соли, хотя это и поможет, в конечном итоге не принесет пользы.

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

0 голосов
/ 01 мая 2009

Я бы использовал что-то вроде:

$salt='Whatever you want';
$folderName=SHA1($salt.date('U'));

Дата ('U') возвращает секунды с начала эпохи Unix (1 января 1970 г., 00:00:00 по Гринвичу), поэтому, вероятно, она будет уникальной, если вы не создадите несколько папок одновременно?

В этом случае просто слегка измените значение $ salt (сделайте его именем пользователя или случайным числом и т. Д.).

0 голосов
/ 01 мая 2009

Используйте дату и время для генерации имени

0 голосов
/ 01 мая 2009

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

0 голосов
/ 01 мая 2009

Язык не был указан, в Ruby я бы сделал:

require 'digest/md5'
Digest::MD5.hexdigest(Time.now.to_s)

=> "f531384b3cc8c60b7c5b7ad087cb0ae4"
...