Any Base
Custom alphabets only need 2+ unique Unicode code points.
Base64 + BaseX codecs
`@splicemood/basex` provides RFC Base64 helpers and arbitrary base-N codecs for JavaScript, Python and Go. Pass alphabets from `@splicemood/alphabet`, including Unicode alphabets with more than 1000 symbols.
import { createBase } from "@splicemood/basex";
import ru from "@splicemood/alphabet/ru";
const basex = createBase(ru);
const token = basex.encode("любой алфавит");
console.log(basex.decode(token));
Custom alphabets only need 2+ unique Unicode code points.
Base64 decoding rejects malformed padding and non-canonical unused bits.
Published JS, Python and Go packages contain source files only.
Install
npm install @splicemood/basex
pip install splicemood-basex
go get github.com/splicemood/basex
BaseX
import { createBase } from "@splicemood/basex";
import ru from "@splicemood/alphabet/ru";
const codec = createBase(ru);
const encoded = codec.encode("SpliceMood");
console.log(codec.decode(encoded));
from splicemood_alphabet.ru import alphabet as ru
from splicemood_basex import create_base
codec = create_base(ru)
encoded = codec.encode("SpliceMood")
print(codec.decode(encoded))
codec, err := basex.NewEncoding(ru.Alphabet)
if err != nil {
panic(err)
}
encoded := codec.EncodeString("SpliceMood")
decoded, err := codec.DecodeString(encoded)
Benchmarks
Benchmarks are local and reproducible. Run them on the target CPU and runtime, then compare Base64, Base62 BaseX and large Unicode alphabets up to 20k symbols with 4096-byte payloads.
npm run bench
Runs JS, Python and Go benchmark suites for Base64 and BaseX.
| Runtime | Scenario | Throughput | Latency | Memory |
|---|---|---|---|---|
| Node.js v20.19.6 | Base64 encode 4 KiB | 25,736 ops/s | 38.9 µs/op | n/a |
| Node.js v20.19.6 | Base64 decode 4 KiB | 8,868 ops/s | 112.8 µs/op | n/a |
| Node.js v20.19.6 | Base62 encode 64 B | 132,031 ops/s | 7.57 µs/op | n/a |
| Node.js v20.19.6 | Base62 decode 64 B | 476,190 ops/s | 2.10 µs/op | n/a |
| Node.js v20.19.6 | Base62 encode 4 KiB | 2,495 ops/s | 400.9 µs/op | n/a |
| Node.js v20.19.6 | Base62 decode 4 KiB | 9,066 ops/s | 110.3 µs/op | n/a |
| Node.js v20.19.6 | Base1200 encode 4 KiB | 4,890 ops/s | 204.5 µs/op | n/a |
| Node.js v20.19.6 | Base1200 decode 4 KiB | 6,962 ops/s | 143.6 µs/op | n/a |
| Node.js v20.19.6 | Base20000 encode 4 KiB | 7,569 ops/s | 132.1 µs/op | n/a |
| Node.js v20.19.6 | Base20000 decode 4 KiB | 8,236 ops/s | 121.4 µs/op | n/a |
| Python 3.12.10 | Base64 encode 4 KiB | 2,232 ops/s | 448.0 µs/op | n/a |
| Python 3.12.10 | Base64 decode 4 KiB | 1,253 ops/s | 798.2 µs/op | n/a |
| Python 3.12.10 | Base62 encode 64 B | 62,211 ops/s | 16.1 µs/op | n/a |
| Python 3.12.10 | Base62 decode 64 B | 61,936 ops/s | 16.1 µs/op | n/a |
| Python 3.12.10 | Base62 encode 4 KiB | 1,344 ops/s | 744.2 µs/op | n/a |
| Python 3.12.10 | Base62 decode 4 KiB | 1,015 ops/s | 984.8 µs/op | n/a |
| Python 3.12.10 | Base1200 encode 4 KiB | 1,371 ops/s | 729.3 µs/op | n/a |
| Python 3.12.10 | Base1200 decode 4 KiB | 1,008 ops/s | 992.5 µs/op | n/a |
| Python 3.12.10 | Base20000 encode 4 KiB | 1,005 ops/s | 995.0 µs/op | n/a |
| Python 3.12.10 | Base20000 decode 4 KiB | 1,097 ops/s | 911.4 µs/op | n/a |
| Go 1.26.2 | Base64 encode 4 KiB | 80,135 ops/s | 12.5 µs/op | 6,144 B/op · 1 alloc |
| Go 1.26.2 | Base64 decode 4 KiB | 22,699 ops/s | 44.1 µs/op | 28,672 B/op · 2 allocs |
| Go 1.26.2 | Base62 encode 64 B | 665,336 ops/s | 1.50 µs/op | 416 B/op · 1 alloc |
| Go 1.26.2 | Base62 decode 64 B | 1,233,502 ops/s | 810.7 ns/op | 1,120 B/op · 3 allocs |
| Go 1.26.2 | Base62 encode 4 KiB | 21,922 ops/s | 45.6 µs/op | 27,264 B/op · 1 alloc |
| Go 1.26.2 | Base62 decode 4 KiB | 21,864 ops/s | 45.7 µs/op | 77,824 B/op · 3 allocs |
| Go 1.26.2 | Base1200 encode 4 KiB | 36,484 ops/s | 27.4 µs/op | 14,336 B/op · 1 alloc |
| Go 1.26.2 | Base1200 decode 4 KiB | 17,895 ops/s | 55.9 µs/op | 85,888 B/op · 4 allocs |
| Go 1.26.2 | Base20000 encode 4 KiB | 41,142 ops/s | 24.3 µs/op | 12,288 B/op · 1 alloc |
| Go 1.26.2 | Base20000 decode 4 KiB | 16,918 ops/s | 59.1 µs/op | 21,760 B/op · 3 allocs |
Snapshot hardware: Intel Core i3-12100F · Windows amd64 · Node.js v20.19.6 · Python 3.12.10 · Go 1.26.2
| Scenario | Dataset | Covered by | Expected behavior |
|---|---|---|---|
| Base64 strings | UTF-8 vectors, Unicode text | `encodeBase64` / `decodeBase64` tests | RFC-compatible output |
| BaseX alphabets | Russian alphabet, base 66 | `createBase` / `NewEncoding` tests | Lossless string and byte round trip |
| Large alphabets | 1200 and 20000 symbols, 4096 bytes | JS, Python and Go test suites | Constant work per fixed block; no whole-buffer big integer conversion |
| Go benchmark | Base62 + base1200 + base20000, 64 B and 4 KiB | `npm run bench:go` | Reports ns/op, B/op and allocs/op |
| JavaScript benchmark | Base62 + base1200 + base20000, 64 B and 4 KiB | `npm run bench:js` | Reports ops/s per scenario |
| Python benchmark | Base62 + base1200 + base20000, 64 B and 4 KiB | `npm run bench:python` | Reports ops/s per scenario |