visus/cuid2
PHP CUID2 generator for collision-resistant, secure, URL-safe IDs built for distributed systems. Uses SHA3-512 with time and entropy for scalable uniqueness. Supports instance or static usage plus identifier validation; GMP can improve performance.
user_123_abc456 → p6p168tx2rxtgyehd3p2wz04)./orders/{cuid}) with built-in uniqueness guarantees.Tradeoffs:
ext-gmp (60–300x faster). Fallback to pure PHP is slower but identical in output.isValid().Random\Randomizer) improve security but exclude legacy systems.Adopt if:
Look elsewhere if:
ramsey/uuid or bamarni/ulid).Alternatives to Evaluate:
| Requirement | CUID2 | ULID | UUIDv4 | Snowflake |
|---|---|---|---|---|
| Collision Resistance | ✅ (SHA3-512 + fingerprint) | ✅ (Monotonic + randomness) | ❌ (122-bit entropy) | ✅ (Time + machine + seq) |
| URL-Safe | ✅ (Base36) | ✅ (Base32) | ❌ (Hex) | ❌ (Hex) |
| Sortable | ✅ (Timestamp in hash) | ✅ (Timestamp prefix) | ❌ | ✅ (Time-based) |
| Distributed | ✅ (No coordination) | ✅ (No coordination) | ❌ (Centralized) | ❌ (Centralized) |
| PHP 8.2+ Only | ✅ | ✅ (PHP 7.4+) | ✅ (PHP 5.6+) | ❌ (Custom impl. needed) |
| Length | 4–32 chars | 26 chars | 36 chars | Variable (64+ bits) |
*"CUID2 lets us generate globally unique, URL-safe IDs across all our microservices without needing a centralized ID generator. This reduces latency, simplifies joins in analytics, and future-proofs our distributed systems. For example:
Ask: "Should we prioritize this for our [distributed event system/API gateway] roadmap?"
*"CUID2 is a drop-in replacement for UUIDs/ULIDs in PHP 8.2+ systems, offering:
ext-gmp (or pure PHP fallback).Cuid2::generate()) or instance-based usage.Cuid2::isValid()) for format checks.ramsey/uuid in distributed services.Random\Randomizer).Proposal:
ramsey/uuid/bamarni/ulid in our stack.Dependencies:
composer require visus/cuid2
Example:
$cuid = Cuid2::generate(); // 'p6p168tx2rxtgyehd3p2wz04'
$shortCuid = Cuid2::generate(10); // 'a1ao2r0lve'
Cuid2::isValid($cuid); // true
Next Steps:
Key Metrics to Track:
visus/cuid2 vs. alternatives (e.g., ramsey/uuid).How can I help you explore Laravel packages today?