uid: SafeShortID and HexShortID — Time-Ordered IDs Without the Rude Words

The dracory/uid package gains two new generators: HexShortID, a fixed 14-character lowercase hex ID, and SafeShortID, the same ID encoded in a vowel-free alphabet so your database never accidentally spells something rude. Both are time-ordered, lock-free, and allocation-light.

uid: SafeShortID and HexShortID — Time-Ordered IDs Without the Rude Words

uid: SafeShortID and HexShortID — Time-Ordered IDs Without the Rude Words

Random IDs have a problem nobody talks about at the interview: sometimes they spell words. Bad words. Words you do not want in a customer-facing URL, an invoice number, or a support ticket reference.

The dracory/uid package already had ShortID() — an 11-character, Crockford Base32, time-ordered ID. Now it has two siblings: HexShortID() and SafeShortID().

Try it — live ID generator

This is a faithful browser port of the Go generator: microsecond timestamp shifted left 4 bits, plus a rolling counter, encoded as fixed-width nibbles. It sorts chronologically, exactly like the real thing.

— press a button —

HexShortID: The Familiar One

HexShortID() gives you a fixed 14-character lowercase hexadecimal string:

id := uid.HexShortID() // "03fa81bc92e4d7"

Fourteen chars, always. No padding surprises, no variable length. It's the same 55-bit composite as ShortID() — microsecond timestamp shifted left 4 bits, plus a 4-bit rolling counter — just encoded in plain base 16 instead of base 32.

Use it when you want IDs that look like the hex strings everyone already recognises: database keys, log correlation IDs, anywhere a UUID would work but a UUID is overkill.

SafeShortID: The Polite One

SafeShortID() is the same 14-character format with one change: the alphabet has no vowels.

id := uid.SafeShortID() // "05fr88tc139r8t"

The alphabet is 0123456789bcdfgh — standard hex, but every vowel-adjacent letter is shifted: a becomes b, e becomes g, f becomes h. Sixteen characters, ascending byte order, zero vowels.

Alphabet map — see what gets filtered

Hover or tap a hex digit to see how SafeShortID re-encodes it. Letters that could form words land on safe consonants.

Tap a digit…

No vowels means no accidental English words. Your generated IDs can't spell "dead", "beef", "cafe", or anything ruder. It's not perfect — leet-speak like "b00b" is still reachable — but the surface area for embarrassment shrinks dramatically.

Use it anywhere an ID might be read aloud or shown to a customer.

The Engine Underneath

Both functions share the same lock-free generator as ShortID(). A package-level atomic.Uint64 packs (microsecond timestamp << 4) | counter into a single word, advanced with a CAS loop:

  • Timestamp advances? Counter resets to zero.
  • Same microsecond? Counter ticks up, up to 16 IDs per microsecond.
  • Counter exhausted? The timestamp bumps forward one microsecond instead of sleeping. Callers never stall.
  • Clock went backwards? The last timestamp is held and the counter keeps rolling.

Bit layout — inspect the last ID you generated

Generate an ID above and its 56-bit layout will appear here.

Because the alphabets are in ascending byte order, the output sorts chronologically — SafeShortID strings order correctly as plain strings, which makes them lovely as primary keys.

func SafeShortID() string {
    return encodeHexFixed(nextShortIDValue(), safeShortAlphabet, 14)
}

The encoder is a fixed-width nibble walker — no modulo, no division, no allocations beyond the final string.

The Fine Print

Same caveats as ShortID(): uniqueness is per-process (two processes in the same microsecond can collide), the IDs are predictable, and they reveal their creation time. Great for sortable keys. Not for security tokens.

FunctionLengthAlphabetWords?
ShortID()11Crockford Base32Rarely
HexShortID()140-9a-fPossibly
SafeShortID()140-9bcdfghAlmost never

Three generators, one engine. Pick the alphabet that fits where the ID will be seen.

← Previous
Bootlegance: 70 Free Bootstrap 5 Themes with Native Dark Mode

Keep Reading

Explore more articles and insights

Bootlegance: 70 Free Bootstrap 5 Themes with Native Dark Mode

Bootlegance: 70 Free Bootstrap 5 Themes with Native Dark Mode

Read Article
A Big, Opinionated List of PHP Libraries (2026 Edition)

A Big, Opinionated List of PHP Libraries (2026 Edition)

Read Article
Ork: SSH Server Automation in Go

Ork: SSH Server Automation in Go

Read Article
View All Blog Posts