2009-03-31 4 views
2

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

Кроме того, я не хочу генерировать имя и искать в базе данных, чтобы увидеть, существует ли файл. Я хочу убедиться, что 100% или 99%, что сгенерированное имя файла никогда ранее не было создано моим приложением.

Любая идея, как я могу написать такое приложение?

ответ

10

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

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

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

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

+0

Не забудьте прочитать следующую статью, если вы собираетесь сделать что-то вроде этого: http://www.linuxworld.com/cgi-bin/mailto/x_linux.cgi?pagetosend=/export /http/httpd/linuxworld/news/2007/111207-hash.html –

+0

Есть ли причины, по которым системы контроля источника не обнаруживают связь в этом мангаре? – ojblass

+0

Некоторые делают. Git записывает все свои файлы во внутренний репозиторий после их хэшей. –

3

GUIDs - один из способов. В основном вы гарантированно не получите повторений (если у вас есть правильный генератор случайных чисел).

1

Лучший способ - просто использовать счетчик. Первый файл - 1, следующий - 2, другой - 3 и т. Д.

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

file = last_file + random(1 through 10) 
+0

+1, но я думаю, что вы хотите «случайный (от 1 до 10)» - если у вас есть 0, вы бы выделили тот же ID, что и в последний раз. –

+0

да, вы правы. Я отредактировал ваше предложение. – carl

2

Вы также можете добавить время с эпохи.

3

Лучшее решение уже упомянуто. Я просто хочу добавить некоторые мысли.

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

Лучшим решением может быть использование GUID в этом сценарии и не нужно заботиться о синхронизации между процессами.

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

Также coommon хранит файлы в структуре каталогов, где местоположение файла зависит от его имени. Файл abcdef1234.xyz может быть сохранен как /ab/cd/ef/1234.xyz. Это позволяет избежать каталогов с огромным количеством файлов. Я не знаю, почему это делается - может быть ограничение файловой системы, проблемы с производительностью, но это довольно часто. Я не знаю, являются ли подобные вещи распространенными, если файлы хранятся непосредственно в базе данных.

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

  • Нет связанных вопросов^_^