@codefusion-cc/base58
v0.1.1
Published
Ids people can read, copy and double-click: random ids and fixed bytes spelled in base58, at a fixed width for their byte count, without look-alike characters
Maintainers
Readme
@codefusion-cc/base58
Ids people read, copy and paste: random ids and fixed-size byte values spelled in base58. Letters and digits
only, without the look-alikes 0, O, I and l, so an id survives being read aloud, typed from a screen,
double-clicked in a URL or a log, and pasted into a shell without quoting. No dependencies; runs in Workers,
browsers and Node.
npm install @codefusion-cc/base58A new id
import { randomId } from '@codefusion-cc/base58'
const deviceId = `d_${randomId(12)}` // d_5qCHTcgbQwpvYZQ9c: 96 random bits, 17 characters
const callId = randomId() // 128 random bits, 22 charactersThe bytes come from crypto.getRandomValues. 12 bytes are plenty for ids that are not secrets.
Bytes an app already has
import { base58ToBytes, bytesToBase58 } from '@codefusion-cc/base58'
const segment = bytesToBase58(accountIdBytes) // always 22 characters for 16 bytes
const bytes = base58ToBytes(segment, 16) // null: not 16 bytes in base58- The width depends only on the byte count (
base58Length): 22 characters for 16 bytes, 44 for 32. A value with small leading bytes is padded with1, the zero digit, so ids of one kind all look alike. - The text sorts like the bytes (the alphabet is in ASCII order), so time-ordered bytes give time-ordered ids.
- A value that needs the full width spells as Bitcoin's base58 does. One with leading zero bytes does not:
Bitcoin spends one
1on each zero byte, this pads to the width. base58ToBytesreads only the exact width for the byte count, and never throws for what text holds (another length, a character outside the alphabet, a value too large for the bytes): it says null.- Every function throws a
RangeErrorfor a byte count that is not one, which only a programming mistake passes.
Moving from base64url ids
Ids are opaque: rows that already hold base64url ids keep them, and new rows get base58 ones. Keep any route
pattern or validation that accepted the old characters (A-Za-z0-9_- is a superset of base58), so old links
keep working.
