HardGuard25: A human-friendly unique ID alphabet. 25 unambiguous characters.
Project description
hardguard25
Python reference implementation of HardGuard25 — an open standard for human-safe identifiers.
0 1 2 3 4 5 6 7 8 9 A C D F G H J K M N P R U W Y
HardGuard25 is a 25-character alphabet designed so every symbol is visually distinct in common identifier contexts, including dyslexia-sensitive workflows. It removes 11 letters that cause real-world errors (I L O B S Z E T V X Q) so IDs survive handwriting, phone calls, OCR, and support tickets with fewer corrections. When a letter and a digit compete for the same visual slot, the digit always wins.
Install
pip install hardguard25
Requires Python 3.9+.
Quickstart
from hardguard25 import generate, validate, normalize, check_digit, verify_check_digit
generate(8) # e.g. "AC3H7PUW"
generate(8, check_digit=True) # e.g. "AC3H7PUWR" (length+1)
validate("ac3h-7puw") # True (case and separators tolerated)
normalize("ac3h-7puw") # "AC3H7PUW"
check_digit("AC3H7PUW") # "R"
verify_check_digit("AC3H7PUWR") # True
API
| Function | Purpose |
|---|---|
generate(length, *, check_digit=False) |
Cryptographically secure random ID using rejection sampling for uniform distribution |
validate(s) |
True if s normalizes to a valid HardGuard25 ID; never raises |
normalize(s) |
Trim, uppercase, strip - _ . and spaces; raises ValueError on invalid chars |
check_digit(code) |
Mod-25 weighted check digit for manual-entry error detection |
verify_check_digit(code) |
Strip last char, recompute, compare |
ALPHABET |
"0123456789ACDFGHJKMNPRUWY" |
Type hints and py.typed marker included.
Sizing
Each character carries log2(25) = 4.64 bits of entropy.
| Length | Bits | Unique IDs | Typical Use |
|---|---|---|---|
| 4 | 18.6 | 390,625 | Small inventory, tickets |
| 5 | 23.2 | 9,765,625 | Small business |
| 6 | 27.9 | 244,140,625 | Medium businesses |
| 7 | 32.5 | 6.1 billion | Large catalogs |
| 8 | 37.2 | 152.6 billion | Large systems |
| 12 | 55.7 | 5.96 × 10¹⁶ | Internal tokens |
| 16 | 74.2 | 3.55 × 10²² | Cross-system IDs |
| 20 | 92.8 | 2.11 × 10²⁷ | Public tokens |
| 22 | 102.1 | 1.32 × 10³⁰ | Internet-scale |
Recommended defaults:
- 16 for internal systems up to millions of IDs
- 20 for public tokens or cross-org use
- 22 for long-lived, internet-scale identifiers
See the spec for collision-bound tables.
Implementation guidance
For project integration guidance, see:
- Human implementation guide: https://github.com/snapsynapse/hardguard25/blob/main/docs/IMPLEMENTATION.md
- AI-assisted implementation guide: https://hardguard25.com/ai-assisted-implementation.txt
- AI-assisted guide SHA-256: https://hardguard25.com/ai-assisted-implementation.txt.sha256
When NOT to Use HardGuard25
- Cryptographic keys (use proper key derivation)
- Blockchain consensus (use domain-specific formats)
- Systems requiring global UUID guarantees (use UUIDv7 or ULID)
- Machine-only contexts where no human ever sees the ID
Reference
- Spec: https://github.com/snapsynapse/hardguard25/blob/main/SPEC.md
- Homepage: https://hardguard25.com/
- Source: https://github.com/snapsynapse/hardguard25
- Other languages: JavaScript, Go (same repo)
License
MIT
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file hardguard25-1.3.3.tar.gz.
File metadata
- Download URL: hardguard25-1.3.3.tar.gz
- Upload date:
- Size: 8.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a2a4dc0b8d8ef4301c79bf78e41c2813075208ebe4e2d349cecfd0d3c390560d
|
|
| MD5 |
47c55184f3d447328fdb5923f4f2b7af
|
|
| BLAKE2b-256 |
e0328b1213530a7fc43a979a7d765a0a0bb76e425c1b3a1735ccba22ea0e2a5e
|
File details
Details for the file hardguard25-1.3.3-py3-none-any.whl.
File metadata
- Download URL: hardguard25-1.3.3-py3-none-any.whl
- Upload date:
- Size: 6.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
800dcb83a28e6c5061dccce45ad85c99778649495281b64ea34342bab0af74f1
|
|
| MD5 |
188ba7aa79090f911cf7dfb38d3b0f8d
|
|
| BLAKE2b-256 |
94a0579874916aff6be9a0d5edad362d9d0a88d12b9450e06ad0b49bf8f873e8
|