Ecoji encodes data as 1024 emojis. It's base1024 with an emoji character set. As a bonus, this repo includes code to decode emojis to the original data they represent.
Many have asked how Ecoji compares to base64. The short answer is that a string encoded with Ecoji will have more bytes, but fewer visible characters, than the same string encoded with base64. With Ecoji, each visible char represents 10 bits, but each character is multi-byte. With base64 each char represents 6 bits and is one byte. The following table shows encoding sha256 in different ways.
Encoding | Bytes | Characters |
---|---|---|
none | 32 | N/A |
hex | 64 | 64 |
base64 | 44 | 44 |
ecoji | 112 | 28 |
Ecoji is published on snapcraft.io and can be installed with :
sudo snap install ecoji
$ ecoji -h
usage: ecoji [OPTIONS]... [FILE]
Encode or decode data as Unicode emojis. ๐
Options:
-d, --decode decode data
-w, --wrap=COLS wrap encoded lines after COLS character (default 76).
Use 0 to disable line wrapping
-h, --help Print this message
-v, --version Print version information.
$ echo "Base64 is so 1999, isn't there something better?" | ecoji
๐๐ฉ๐ฆ๐๐๐๐ฏ๐๐๐ฝ๐๐๐ฑ๐ฅ๐๐ฑ๐๐ญ๐ฎ๐ต๐ข๐ฅ๐ญ๐ธ๐๐ฒ๐ฆ๐ถ๐ข๐ฅ๐ฎ๐บ๐๐ธ๐ฎ๐ผ๐ฆ๐๐ฅด๐
$ echo ๐๐ฉ๐ฆ๐๐๐๐ฏ๐๐๐ฝ๐๐๐ฑ๐ฅ๐๐ฑ๐๐ญ๐ฎ๐ต๐ข๐ฅ๐ญ๐ธ๐๐ฒ๐ฆ๐ถ๐ข๐ฅ๐ฎ๐บ๐๐ธ๐ฎ๐ผ๐ฆ๐๐ฅด๐ | ecoji -d
Base64 is so 1999, isn't there something better?
$ echo -n abc | ecoji
๐๐ธ๐โ
$ echo -n 6789 | ecoji
๐ฅ๐ค ๐ ๐
$ echo XY | ecoji
๐ฒ๐ก๐โ
$ echo ๐๐ธ๐โ๐ฅ๐ค ๐ ๐๐ฒ๐ก๐โ | ecoji -d
abc6789XY
$ cat encode.go | openssl dgst -binary -sha1 | ecoji
๐ฐ๐๐ก๐๐ถ๐ฆ
๐ก๐บ๐๐๐ก๐ฆ๐๐๐๐ฆ
$ echo ๐ฐ๐๐ก๐๐ถ๐ฆ
๐ก๐บ๐๐๐ก๐ฆ๐๐๐๐ฆ | ecoji -d | openssl base64
GhAkTyOY/Pta78KImgvofylL19M=
$ cat encode.go | openssl dgst -binary -sha1 | openssl base64
GhAkTyOY/Pta78KImgvofylL19M=
(If you want to use Ecoji for hashes, consider the dangers inherent in older systems without utf8 emoji support, different fonts, and similar emojis.)
Four base1024 emojis can represent 1 trillion unique IDs. In the example below af82dd48f7
represents a 5 byte id for a URL in a key value store like Accumulo. When someone enters the URL, the 5 byte id could be used to obtain the actual URL from the database and then redirect.
$ printf "https://ecoji.io/%s\n" $(echo af82dd48f7 | xxd -r -p | ecoji)
https://ecoji.io/๐๐๐ ๐
Data encoded with Ecoji sorts the same as the input data.
$ echo -n a | ecoji > /tmp/test.ecoji
$ echo -n ab | ecoji >> /tmp/test.ecoji
$ echo -n abc | ecoji >> /tmp/test.ecoji
$ echo -n abcd | ecoji >> /tmp/test.ecoji
$ echo -n ac | ecoji >> /tmp/test.ecoji
$ echo -n b | ecoji >> /tmp/test.ecoji
$ echo -n ba | ecoji >> /tmp/test.ecoji
$ export LC_ALL=C
$ sort /tmp/test.ecoji > /tmp/test-sorted.ecoji
$ diff /tmp/test.ecoji /tmp/test-sorted.ecoji
$ cat /tmp/test-sorted.ecoji
๐โโโ
๐๐ฒโโ
๐๐ธ๐โ
๐๐ธ๐ฆโ
๐๐โโ
๐โโโ
๐๐ขโโ
Libraries implementing the Ecoji encoding standard. Submit PR to add a library to the table.
Language | Comments |
---|---|
D | Implementation of Ecoji written in the D programming language. |
Go | This repository offers a Go library package with two functions ecoji.Encode() and ecoji.Decode(). |
Java | Implementation of Ecoji written in Java, usable in any JVM language. |
.NET | Implementation of Ecoji written in C# targeting .NET Standard 2.0: dotnet add package Ecoji . |
PHP | PHP 7.x implementation of Ecoji. Available as rayne/ecoji on Packagist. |
Python | Implementation of Ecoji written in the Python3 programming language. |
Rust | Implementation of Ecoji written in the Rust programming language. |
Swift | Implementation of Ecoji written in the Swift programming language. |
This is my first Go project and I am starting to get my bearings. If you are new to Go I would recommend this video and the tour.
# The following are general Go setup instructions. Ignore if you know Go, I am new to it.
export GOPATH=~/go
export PATH=$GOPATH/bin:$PATH
# This will download Ecoji to $GOPATH/src
go get github.com/keith-turner/ecoji
# This will build the ecoji command and put it in $GOPATH/bin
go install github.com/keith-turner/ecoji/cmd/ecoji