?

Log in

No account? Create an account
хранение идентификатора формата файла - язык, на котором не говорят [entries|archive|friends|userinfo]
beroal

[ website | personal website ]
[ userinfo | livejournal userinfo ]
[ archive | journal archive ]
[ tags | journal tags ]

хранение идентификатора формата файла [Feb. 8th, 2017|05:53 pm]
beroal
[Tags|]

Способы хранить идентификатор формата файла:
  • в атрибутах файла в файловой системе;
  • внутри файла.

Последний способ означает, что в начале файла находится
достаточно длинный список битов, который вряд ли встретится в
файлах, имеющих другой формат. Этот список называется магическим
числом (magic number). Магическое число может быть каким-то словом
в кодировке ASCII, днём рождения автора формата… Я подумал: зачем
создавать магическое число из мусора, если можно взять
идентификатор документа, описывающий формат файла. Если вам в руки
попадёт файл неизвестного формата, вы сможете найти этот документ
по идентификатору, изучить этот формат и написать парсер этого
формата. Таким образом вы сможете прочитать файл. ☺ Конечно,
обыватель этим заниматься не будет, да и программист, скорее
всего, побежит в интернет искать бесплатный просмотрщик. Но сама
идея мне нравится. Дальше написаны детали её реализации.

Простейший идентификатор документа — это его криптографический
хэш. Какую хэш-функцию следует использовать? Как ни странно,
любую. Рассмотрим алгоритм получения документа, описывающего
формат. Ищем в distributed hash table (DHT) документ по
идентификатору. Алгоритмы DHT могут искать по любым ключам.
Получаем документ от некоторого хоста и проверяем, что он
соответствует идентификатору. То есть хост, хранящий документ,
должен сообщить имя хэш-функции. Другой способ: попробовать все
известные хэш-функции при проверке.

А вот длина идентификатора документа важна. Точнее, важно, чтобы
он был не короче некоторого n. Префикс файла длиннее
n, вероятно, будет отличаться у разных файлов,
имеющих одинаковый формат! По такому префиксу вряд ли найдём
описание формата. По префиксу короче n, в принципе,
можно найти описание формата, если DHT поддерживает поиск по
префиксу ключа. Нужно выбрать простое и очевидное n.
Лично мне нравятся числа из множества {2^(2^n) | n∈ℕ}.

Документ, описывающий формат файлов, — это тоже файл.
Следовательно, в начале документа находится… Ага, получилась
циклическая зависимость. Следовательно, нужно выбрать базовый
идентификатор документа, который не является хэшем, но мы считаем,
что он связан с эфемерным документом, описывающим базовый формат
файлов. Например, базовый идентификатор документа — нули, базовый
формат файлов — обычный текст в кодировке ASCII, содержащий только
печатные символы.
LinkReply