Написать пост

Кодирование данных с помощью эмодзи: обзор инструмента 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 использованы по полной;
  • Добавить поддержку мультипроцессорных систем.
Следите за новыми постами
Следите за новыми постами по любимым темам
3К открытий3К показов