Ответ 1
Ваш вопрос несколько запутан, так как вы подробно рассказываете о Linux, но затем в комментарии к другому ответу вы говорите, что вы генерируете имена файлов для загрузки людей, что, предположительно, означает, что у вас нет абсолютно никакого контроля над файловой системой и что файлы будут сохранены, что делает Linux совершенно неуместным.
В целях этого ответа я собираюсь предположить, что ваш вопрос неверен, и ваш комментарий верен.
Подавляющее большинство используемых сегодня операционных систем и файловых систем относятся примерно к трем категориям: POSIX, Windows и MacOS.
В спецификации POSIX очень четко указано, как выглядит имя файла, которое, как гарантируется, переносится во всех системах POSIX. Символы, которые вы можете использовать, определены в Раздел 3.276 (набор символов переносимого файла) базовой спецификации Open Group как:
ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz 0123456789._-Максимальное имя файла длина, на которую вы можете положиться, определяется в Раздел 13.23.3.5 (
<limits.h>
Минимальные значения) как 14
. (Соответствующая константа _POSIX_NAME_MAX
.)
Итак, имя файла длиной до 14 символов и содержит только 65 символов, перечисленных выше, безопасно использовать во всех совместимых с POSIX системах, что дает вам комбинации 24407335764928225040435790 (или примерно 84 бит).
Если вы не хотите раздражать своих пользователей, вы должны добавить еще два ограничения: не начинайте имя файла с тире или точки. Имена файлов, начинающиеся с точки, обычно интерпретируются как "скрытые" файлы и не отображаются в списках каталогов, если они явно не запрашиваются. И имена файлов, начинающиеся с тире, могут быть интерпретированы как опция многими командами. (Sidenote: удивительно, сколько пользователей не знают о трюках 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).
Если вы хотите, чтобы ваши пользователи могли записывать файлы на CD-R, отформатированные в соответствии с ISO9660 Level 1, вам необходимо запретить дефис где угодно, а не только как первый символ. Теперь оставшийся набор символов выглядит как
ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789_, который дает вам комбинации 3512479453921 (41 бит).