New: ID() — Fast, Human-Readable Random Identifier
(GoFakeIt v7.9.0)
gofakeit.ID() is a new high-performance identifier generator designed for speed, readability, and practically zero collision probability.
Unlike UUID v4 or XID, this generator is intentionally random-first, not structure-based.
Perfect for mock APIs, test data, fixtures, seed data, and temporary identifiers.
Highlights
- Human readable alphabet, no confusing characters
→23456789abcdefghjkmnpqrstuvwxyz(no 1, l, i or 0, o to alleviate confusion) - Fast
- Memory Allocation
- Generates from your rand source
- Shorter than UUID, faster than XID, and requires no coordination
Example
id := gofakeit.ID()
fmt.Println(id)
// → "3t9qf4c92npxhw7bg6y0"Performance Benchmarks
Measured on Go 1.25
| Generator / Function | Benchmark Name | ops/sec | ns/op | B/op | allocs/op |
|---|---|---|---|---|---|
gofakeit.ID()
| BenchmarkID-10 | 31,383,146 | 37.8 ns | 24 | 1 |
gofakeit.UUIDv4()
| BenchmarkUUIDv4-10 | 22,131,577 | 53.8 ns | 48 | 1 |
github.com/rs/xid
| BenchmarkXID-10 | 16,190,817 | 74.2 ns | 0 | 0 |
github.com/google/uuid (v4)
| BenchmarkGoogleUUIDv4-10 | 3,098,770 | 386.1 ns | 64 | 2 |
Takeaway: gofakeit.ID() is ~2× faster than XID and ~10× faster than UUID v4, while being shorter and human-readable.
Collision Probability (Randomness Math)
- ID length: 20 characters
- Alphabet: 32 slots with one duplicated character (intentional) → avoids retries, maximizes speed
- Effective entropy: ≈ 98.25 bits
Even under very large bursts, duplication is astronomically unlikely
Collision probability when generating n IDs within 1 second (birthday bound)
| n (IDs in 1s) | gofakeit.ID() collision probability
|
|---|---|
| 100,000 | 0.00000000000000000001326 |
| 1,000,000 | 0.000000000000000001326017 |
| 10,000,000 | 0.000000000000000132601736 |
| 100,000,000 | 0.000000000000013260173678 |
| 1,000,000,000 | 0.000000000001326017367838 |
For comparison (same n):
- UUID v4 (122 bits): much lower probabilities (but significantly slower and longer)
- XID: structural uniqueness (time + machine + pid + counter). Treat collisions as operationally zero when configured normally.
Need structural, sortable IDs? Use XID or Snowflake.
Want random, readable, fast? Usegofakeit.ID().
RNG Behavior
| Mode | Behavior |
|---|---|
Default (gofakeit.ID())
| PCG for speed, seeded via crypto/rand → fast + unpredictable |
Full crypto (NewFaker(source.NewCrypto()))
| crypto/rand for every ID → maximum randomness (slower) |
Deterministic (New(seed))
| PCG with fixed seed → reproducible ID sequences (useful for tests/fixtures) |
We seed PCG with a cryptographic seed when
seed == 0. This prevents accidental identical streams across processes/containers.
Example Usage
package main
import (
"fmt"
"github.com/brianvoe/gofakeit/v7"
"github.com/brianvoe/gofakeit/v7/source"
)
func main() {
// Fast ID — PCG, automatically crypto-seeded
fmt.Println("fast ID:", gofakeit.ID())
// Cryptographically secure per-ID RNG
crypto := source.NewCrypto()
faker := gofakeit.NewFaker(crypto, true)
fmt.Println("crypto ID:", faker.ID())
}