Ваш вопрос несколько сбивает с толку, так как вы много говорите о Linux, но затем в комментарии к другому ответу вы говорите, что генерируете имена файлов для загрузки людьми, что, вероятно, означает, что вы совершенно не имеете никакого контроля над файловой системой и операционная система, в которой будут храниться файлы, что делает Linux совершенно неактуальным.
Для целей этого ответа я собираюсь предположить, что ваш вопрос неправильный, а ваш комментарий правильный.
Подавляющее большинство используемых сегодня операционных систем и файловых систем делятся примерно на три категории: POSIX, Windows и MacOS.
Спецификация POSIX очень четко показывает, как выглядит имя файла, которое гарантированно переносимо во всех системах POSIX. Символы, которые вы можете использовать, определены в разделе 3.276 (набор символов переносимого имени файла) базовой спецификации открытой группы как:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
0123456789._-
Максимальная длина имени файла, на которую вы можете положиться, определена в
разделе 13.23.3.5 (<limits.h>
минимальные значения) как
14
. (Соответствующая константа
_POSIX_NAME_MAX
.)
Таким образом, имя файла длиной до 14 символов, содержащее только 65 символов, перечисленных выше, безопасно использовать во всех POSIX-совместимых системах, что дает вам 24407335764928225040435790 комбинаций (или примерно 84 бита).
Если вы не хотите раздражать своих пользователей, вы должны добавить еще два ограничения: не начинайте имя файла с тире или точки. Имена файлов, начинающиеся с точки, обычно интерпретируются как «скрытые» файлы и не отображаются в списках каталогов без явного запроса. И имена файлов, начинающиеся с тире, могут интерпретироваться как опция многими командами. (Замечание: удивительно, сколько пользователей не знают о трюках rm ./-rf
или rm -- -rf
.)
Это оставляет вам 23656340818315048885345458 комбинаций (все еще 84 бита).
Windows добавляет к этому пару новых ограничений: имена файлов не могут заканчиваться точкой, а имена файлов не чувствительны к регистру. Это уменьшает набор символов с 65 до 39 символов (37 для первого, 38 для последнего символа). Это не добавляет никаких ограничений по длине, Windows может нормально работать с 14 символами.
Это уменьшает возможные комбинации до 17866587696996781449603 (73 бита).
Другое ограничение заключается в том, что Windows рассматривает все после последней точки как расширение имени файла, которое обозначает тип файла. Если вы хотите избежать путаницы (например, если вы генерируете имя файла, например abc.mp3
для текстового файла), вам следует избегать точек в целом.
У вас все еще есть 13090925539866773438463 комбинации (73 бита).
Если вам нужно беспокоиться о DOS, то применяются дополнительные ограничения: имя файла состоит из одной или двух частей (разделенных точкой), где ни одна из двух частей не может содержать точку. Первая часть имеет максимальную длину 8, вторая из 3 символов. Опять же, вторая часть обычно зарезервирована для указания типа файла, который оставляет вам только 8 символов.
Теперь у вас есть 4347792138495 возможных имен файлов или 41 бит.
Хорошей новостью является то, что вы можете использовать 3-символьное расширение, чтобы на самом деле правильно указывать тип файла, не нарушая ограничения имени файла POSIX (8 + 3 + 1 = 12 <14). </p>
Если вы хотите, чтобы ваши пользователи могли записывать файлы на CD-R, отформатированный по стандарту ISO9660 уровня 1, вам нужно запретить дефис в любом месте, а не только в качестве первого символа. Теперь оставшийся набор символов выглядит как
ABCDEFGHIJKLMNOPQRSTUVWXYZ
0123456789_
, что дает вам 3512479453921 комбинаций (41 бит).