Кодирование данных с помощью эмодзи: обзор инструмента Base100

Утилита работает аналогично base64, но вместо представления данных в текстовом виде превращает их в эмодзи.
Эмодзи

Base💯 — это утилита командной строки, которая позволяет представить любой байт информации в виде уникального эмодзи. Она работает по тому же принципу, что и Base64.

Использование

$ echo "the quick brown fox jumped over the lazy dog" | base100
👫👟👜🐗👨👬👠👚👢🐗👙👩👦👮👥🐗👝👦👯🐗👡👬👤👧👜👛🐗👦👭👜👩🐗👫👟👜🐗👣👘👱👰🐗👛👦👞🐁

Реализовано все достаточно просто. В стандартный поток ввода приходят исходные данные, а в stdout идёт кодировка в виде эмодзи. Данные кодируются автоматически, если не прописан флаг --decode. Функция --encode ничего не делает и существует только для людей, которые не хотят читать документацию.

Использование:
    base100 [FLAGS] [input]

Флаги:
    -d, --decode     Говорит base💯 раскодировать данные
    -e, --encode     Говорит base💯 закодировать данные
    -h, --help       Выводит справку  
    -V, --version    Выводит информацию о версии

Аргументы:
    <input>    Входной файл для использования

Подводные камни

Base💯 крайне неэффективна по памяти. Она увеличивает объём данных примерно в 3 раза, поэтому её стоит использовать, лишь когда вам нужно использовать наименьшее количество символов для записи данных. Хорошим примером использования будет кодирование хэшей и контрольных сумм.

Производительность

$ base100 --version
base💯 0.3.0

$ base64 --version
base64 (GNU coreutils) 8.28

$ cat /dev/urandom | pv | base100 > /dev/null
 [ 247MiB/s]

$ cat /dev/urandom | pv | base64 > /dev/null
 [ 232MiB/s]

$ cat /dev/urandom | pv | base100 | base100 -d > /dev/null
 [ 233MiB/s]

$ cat /dev/urandom | pv | base64 | base64 -d > /dev/null
 [ 176MiB/s]

Base💯 имеет хорошую производительность и немного превосходит GNU base64.

На машинах, поддерживающих AVX2, используется вручную настроенный x86-64 декодировщик, и производительность возрастает на 25%. Скоро будет добавлена поддержка AVX-512. Также ведется работа над векторизованным кодировщиком для AVX2 и SSE2.

Обратите внимание, что приведенные ниже тесты были сделаны на значительно более слабой машине, чем те, что расположены выше, и их не стоит сравнивать напрямую.

$ base100 --version
base💯 0.3.0-dirty

$ base64 --version
base64 (GNU coreutils) 8.28

$ cat /dev/zero | pv | ./base100 | ./base100 -d > /dev/null
 [ 191MiB/s]

$ cat /dev/zero | pv | base64 | base64 -d > /dev/null
 [ 110MiB/s]

В этом случае base💯 сильно обгоняет по производительности base64.

Будущие планы

  • Разрешить кодирование данных с помощью 1024 элементов emoji;
  • Произвести дополнительную оптимизацию и убедиться в том, что возможности SIMD использованы по полной;
  • Добавить поддержку мультипроцессорных систем.

Максим Леонов