четверг, 22 марта 2018 г.

Бинарный формат PSON

PSON (Pandora Simple Object Notation) – бинарный формат упаковки, позволяющий переводить простые типы данных, массивы и списки в последовательность байт (простую строку). PSON придуман и разработан для использования в свободной распределённой информационной системе Pandora как более простая альтернатива бинарному формату BSON.



Поддерживаемые типы

Текущая версия PSON поддерживает упаковку значений 9 типов:
1. Целое число (Integer)
2. Дробное число (Float)
3. Строка (String)
4. Логическое (Boolean)
5. Дата и время (Time в Ruby или Datetime в Python)
6. Массив (Array в Ruby или List в Python)
7. Словарь (Hash в Ruby или Dict в Python)
8. Символьное (Symbol в Ruby)
9. Пустое значение (Nil).

При упаковке массивов и словарей вложенные значения также упаковываются, например:

value = ['Hello', 1500, 3.14, true, {:name=>'Michael', :family=>'Jackson'}]

будет упаковано в строку длиной 57 байт, а при обратной распаковке выдаст идентичный объект.

Реализация на Ruby и Python

Код для упаковки и распаковки написан на языках Ruby и Python, но при желании может быть реализован и на других языках программирования.

Код на Ruby.

Код на Python.

Искать по слову "pson".

Область применения

Сегодня PSON используется для:
1) упаковки записи перед созданием новой подписи и перед проверкой существующих подписей;
2) передачи данных по сети;
3) сохранения нескольких значений в одно поле таблицы базы данных.

Формат упаковки

В упакованном виде каждое значение содержит одну обязательную (*) и две необязательных компоненты:


Таблица 1. Компоненты PSON


Первые 4 бита в Type задают тип данных: целое (PT_Int=0), строка (PT_Str=1), логическое (PT_Bool=2), время (PT_Time=3), массив (PT_Array=4), хэш (PT_Hash=5), символьное (PT_Sym=6), дробное (PT_Real=7), зарезервировано для других типов (8-14), пустое (PT_Nil=15). 5й бит используется как признак «отрицательный» для численных или логических значений. Оставшиеся 3 бита показывают блину поля Length в байтах. «0» означает, что поля «Length» и «Data» пропущены.

В поле Length задано целое число. Поле Length может быть в пределах (1..7) байт, 1 байт означает что длина в пределах 255, 2 – в пределах 65535, а 7 – в пределах 256^7=7*10^16. Если тип данных указан как Int или Time, то поле Length содержит значение, а поле Data опускается. Если же тип данных задан как Str, Sym, Array, Hash или Real, то поле Length указывает длину данных, а сами данные содержатся в поле Data.

Для упаковки нескольких значений желательно помещать их в массив (как в примере выше).
Также для упаковки записей создан дополнительный формат – Name-PSON. Такой формат удобен для представления записей из таблицы базы данных перед подписыванием или передачей по сети. При упаковке входной параметр задаётся как Hash, в котором название поля задано в виде строки или символа, например:
{:name=>'Michael', 'family'=>'Jackson', 'birthday'=>Time.parse('29.08.1958'), :sex=>1}
Перед упаковкой имена полей будут переведены в текст, поля будут отсортированы по алфавиту, а затем упакованы в виде последовательности:
Len1:Name1:Pson1 | Len2:Name2:Pson2 | Len3:Name3:Pson3 | Len4:Name4:Pson4
Каждое поле и значение представлено тремя обязательными компонентами:


Таблица 2. Компоненты Name-PSON

Для примера выше распакованное значение будет выглядеть так:
{"birthday"=>1958-08-29 00:00:00 +0500, "family"=>"Jackson", "name"=>"Michael", "sex"=>1}
Обратите внимание, все имена полей стали строковыми (хотя изначально были и строковые, и символьные), а поля отсортированы по алфавиту. Такая строгость обеспечивает формирование определенной структуры перед созданием подписи, а в дальнейшем, на других компьютерах – создание идентичной структуры и проверку имеющихся подписей, что исключает разночтение структуры и ошибки при проверке подписей.

Достоинства

1) простой (в отличие от BSON)
2) компактный (в отличие от JSON и XML), так как хранит данные в сыром (бинарном) виде и не требует преобразования в Base64
3) однозначность упаковки
4) легкая упаковка и быстрая распаковка, так как формат строго структурирован. Не требует преобразования и парсинга, работает мгновенно и экономит вычислительные ресурсы и электроэнергию

Недостатки

1) отсутствие человекочитаемости (что не имеет значения при машинной обработке)
2) чувствительность к искажениям при передаче по сети (не страшно при CRC-проверке, шифровании или подписи)

Заключение

В целом PSON, являясь простым и быстрым форматом, при подписывании, проверке подписи и передаче данных по сети экономит дисковое пространство, процессорные мощности и сетевой трафик.

Бинарный формат PSON был разработан мною для распределённой информационной системы Pandora, опубликованной под GNU GPL2, а значит, передан в общественное достояние и может свободно использоваться в социальных, коммерческих, управленческих и других приложениях.

P.S. Статья написана для сообщества Хабрахабр.

Комментариев нет :

Отправить комментарий