Какой вариант лучше выбрать для случайного имени файла на диске sha1 или uniqid? - PullRequest
5 голосов
/ 03 июня 2011

Для сохранения загруженных файлов пользователями на удаленном сервере в папке на диске я изменяю имя файла на

$filename = '/tmp/foo.txt';
$newName = sha1_file($filename); // 40 characters 
//or I can do
$newName = uniqid($filename) // 13 characters 

Какой метод является более надежным для нового имени, который вряд ли даст сбой ?? Благодарю.

Ответы [ 4 ]

6 голосов
/ 03 июня 2011

Лучшее решение - использовать tmpfile() или tempnam(). Любой из них гарантированно создаст неиспользуемый файл, который не будет конфликтовать и не может быть «перехвачен» мошенническими процессами, меняющими права доступа к вам. tmpfile() автоматически удаляет файл при его закрытии, тогда как tempnam() сохраняет его около

http://www.php.net/manual/en/function.tmpfile.php

http://www.php.net/manual/en/function.tempnam.php

1 голос
/ 03 июня 2011

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

В этом случае лучше иметь uniqueid.Хотя меньший диапазон из 13 символов будет указывать на гораздо более высокую вероятность столкновений, это не так, потому что редко, когда 2 файла загружаются в один и тот же момент.Даже если использование имени файла в качестве префикса (и благодаря этому увеличение длины вашего $ newname) в большинстве случаев избавит вас от коллизий.Если вы хотите убедиться, вы можете добавить проверку цикла для существующего файла и перестроить имя до тех пор, пока у вас не возникнет коллизия (или не будет дано условие прерывания).

1 голос
/ 03 июня 2011

В любом случае вы хотите проверить, существует ли файл уже. Если вы хотите быть на 100% безопасными, а файлы не слишком большими, просто используйте

sha1_file($filename);

Это вытянет SHA-1 для всего файла, поэтому, даже если файл уже существует, его содержимое остается тем же.

Мир

1 голос
/ 03 июня 2011

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

...