Автоматически генерировать имена файлов без коллизий


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

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

Есть идеи, как я могу написать такое заявление?

5 2

5 ответов:

Можно создать хэш на основе самого содержимого файла. Для этого есть две веские причины:

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

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

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

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

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

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

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

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

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

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

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

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

file = last_file + random(1 through 10)