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