Лучшее решение уже упоминалось. Я просто хочу добавить несколько мыслей.
Самое простое решение - иметь счетчик и приращение для каждого нового файла. Это работает довольно хорошо, если только один поток создает новые файлы. Если несколько потоков, процессов или даже систем добавляют новые файлы, все становится немного сложнее. Вы должны координировать создание новых идентификаторов с блокировкой или любым другим методом синхронизации. Вы также можете назначить диапазоны идентификаторов для каждого процесса, чтобы сократить время синхронизации, или расширить идентификатор файла уникальным идентификатором процесса.
Лучшим решением может быть использование идентификаторов GUID в этом сценарии, и вам не нужно заботиться о синхронизации между процессами.
Наконец, вы можете при случайных данных к каждому идентификатору сделать их сложнее, чтобы угадать, является ли это требованием.
Кроме того, Coommon хранит файлы в структуре каталогов, где местоположение файла зависит от его имени. Файл abcdef1234.xyz может храниться как /ab/cd/ef/1234.xyz. Это позволяет избежать каталогов с огромным количеством файлов. Я не совсем понимаю, почему это делается - могут быть ограничения файловой системы, проблемы с производительностью - но это довольно часто. Я не знаю, распространены ли подобные вещи, если файлы хранятся непосредственно в базе данных.