ULID: ਇੱਕ ਸੰਖੇਪ, ਸਮਾਂ-ਕ੍ਰਮਬੱਧ ਪਛਾਣਕਰਤਾ
ULID (Universally Unique Lexicographically Sortable Identifier) ਇੱਕ 26-ਅੱਖਰੀ, ਕੇਸ-ਇਨਸੈਂਸਟਿਵ, ਬਿਨਾਂ ਹਾਈਫਨ ਵਾਲਾ ਪਛਾਣਕਰਤਾ ਹੈ। ਇਸ ਪੰਨੇ 'ਤੇ, ਤੁਸੀਂ 1 ਤੋਂ 100 ਤੱਕ ਕਿਸੇ ਵੀ ਗਿਣਤੀ ਵਿੱਚ ULID ਤੁਰੰਤ ਤਿਆਰ ਕਰ ਸਕਦੇ ਹੋ। ਹਰ ULID 26 ਅੱਖਰਾਂ ਦੀ ਇੱਕ ਸਟ੍ਰਿੰਗ ਹੈ, ਜੋ ਕਿ Crockford base32 ਅਲਫਾਬੈੱਟ (0-9, A-Z ਮਾਈਨਸ I, L, O, U) ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਬਣਾਈ ਜਾਂਦੀ ਹੈ। ਇਹ UUID (36 ਅੱਖਰ) ਨਾਲੋਂ ਛੋਟਾ ਹੈ, URL-ਸੁਰੱਖਿਅਤ ਹੈ, ਅਤੇ ਟਾਈਮ-ਸੌਰਟੇਬਲ ਹੈ - ਪਹਿਲੇ 10 ਅੱਖਰ ਮਿਲੀਸਕਿੰਟ-ਸ਼ੁੱਧਤਾ ਟਾਈਮਸਟੈਂਪ ਨੂੰ ਐਨਕੋਡ ਕਰਦੇ ਹਨ।
ULID ਦੀ ਖਾਸੀਅਤ ਇਹ ਹੈ ਕਿ ਇਹ UUID v4 ਦੀ 128-ਬਿੱਟ ਸਪੇਸ ਨੂੰ ਬਰਕਰਾਰ ਰੱਖਦਾ ਹੈ ਪਰ 36 ਦੀ ਬਜਾਏ 26 ਅੱਖਰਾਂ ਵਿੱਚ ਫਿੱਟ ਹੁੰਦਾ ਹੈ। ਇਹ ਕੇਸ-ਇਨਸੈਂਸਟਿਵ ਹੈ, ਕੋਈ ਹਾਈਫਨ ਨਹੀਂ ਹੈ, ਅਤੇ URL-ਸੁਰੱਖਿਅਤ ਹੈ - ਕੋਈ ਐਸਕੇਪਿੰਗ ਦੀ ਲੋੜ ਨਹੀਂ।
ULID ਦੀ ਅੰਦਰੂਨੀ ਬਣਤਰ: 48-ਬਿੱਟ ਟਾਈਮਸਟੈਂਪ + 80-ਬਿੱਟ ਰੈਂਡਮ
ਹਰ ULID 128 ਬਿੱਟ (16 ਬਾਈਟ) ਡੇਟਾ ਨੂੰ 26 ਅੱਖਰਾਂ ਵਿੱਚ ਐਨਕੋਡ ਕਰਦਾ ਹੈ। ਇਹ ਦੋ ਹਿੱਸਿਆਂ ਵਿੱਚ ਵੰਡਿਆ ਜਾਂਦਾ ਹੈ:
- ਪਹਿਲੇ 10 ਅੱਖਰ (48 ਬਿੱਟ): ਇਹ ਮਿਲੀਸਕਿੰਟ-ਸ਼ੁੱਧਤਾ ਟਾਈਮਸਟੈਂਪ ਨੂੰ ਦਰਸਾਉਂਦੇ ਹਨ। 48 ਬਿੱਟ Unix epoch (1970-01-01) ਤੋਂ ਲੈ ਕੇ ਲਗਭਗ 10895 ਸਾਲਾਂ ਤੱਕ ਦਾ ਸਮਾਂ ਕਵਰ ਕਰ ਸਕਦੇ ਹਨ।
- ਬਾਕੀ 16 ਅੱਖਰ (80 ਬਿੱਟ): ਇਹ ਇੱਕ ਰੈਂਡਮ ਕੰਪੋਨੈਂਟ ਹੈ, ਜੋ
crypto.getRandomValues()ਨਾਲ ਬ੍ਰਾਊਜ਼ਰ ਵਿੱਚ ਸਥਾਨਕ ਤੌਰ 'ਤੇ ਤਿਆਰ ਕੀਤਾ ਜਾਂਦਾ ਹੈ।
ਉਦਾਹਰਨ: 01ARZ3NDEKTSV4RRFFQ69G5FAV। ਇੱਥੇ 01ARZ3NDEK ਟਾਈਮਸਟੈਂਪ ਹੈ (01 ਜਨਵਰੀ 2021), ਅਤੇ TSV4RRFFQ69G5FAV ਰੈਂਡਮ ਹਿੱਸਾ ਹੈ।
Crockford Base32: ਕੇਸ-ਇਨਸੈਂਸਟਿਵ ਅਤੇ ਦ੍ਰਿਸ਼ਟੀਗਤ ਤ੍ਰਾਸਦੀ-ਰਹਿਤ
Crockford base32 ਇੱਕ ਐਨਕੋਡਿੰਗ ਸਕੀਮ ਹੈ ਜੋ 5 ਬਿੱਟ ਪ੍ਰਤੀ ਅੱਖਰ ਨੂੰ 32 ਅੱਖਰਾਂ (0-9, A-Z ਮਾਈਨਸ I, L, O, U) ਵਿੱਚ ਮੈਪ ਕਰਦੀ ਹੈ। I, L, O, U ਨੂੰ ਹਟਾਏ ਜਾਣ ਦਾ ਕਾਰਨ:
- I (ਆਈ) ਅਤੇ 1 (ਇੱਕ) ਉਲਝਣ ਪੈਦਾ ਕਰ ਸਕਦੇ ਹਨ।
- O (ਓ) ਅਤੇ 0 (ਜ਼ੀਰੋ) ਵੀ ਉਲਝਣ ਵਾਲੇ ਹਨ।
- L (ਐੱਲ) ਕੁਝ ਫੌਂਟਾਂ ਵਿੱਚ
Iਵਰਗਾ ਦਿਖਦਾ ਹੈ। - U (ਯੂ)
V(ਵੀ) ਨਾਲ ਉਲਝਣ ਵਾਲਾ ਹੈ।
ULID ਕੇਸ-ਇਨਸੈਂਸਟਿਵ ਹੈ - 01ARZ3NDEK ਅਤੇ 01arz3ndek ਬਰਾਬਰ ਹਨ। ਇਹ API ਡਿਜ਼ਾਈਨ, UI, ਅਤੇ ਡਾਟਾਬੇਸ ਕਵੇਰੀ ਵਿੱਚ ਲਚਕਤਾ ਦਿੰਦਾ ਹੈ।
UUID v4, UUID v7, ਅਤੇ ULID: ਤੁਲਨਾ
| ਫੀਚਰ | UUID v4 | UUID v7 | ULID |
|---|---|---|---|
| ਅੱਖਰ | 36 (32 + 4 ਹਾਈਫਨ) | 36 (32 + 4 ਹਾਈਫਨ) | 26 (ਕੋਈ ਹਾਈਫਨ ਨਹੀਂ) |
| ਬਿੱਟ | 122 ਬਿੱਟ ਰੈਂਡਮ + 6 ਬਿੱਟ ਵਰਜਨ | 48 ਬਿੱਟ ਟਾਈਮਸਟੈਂਪ + 74 ਬਿੱਟ ਰੈਂਡਮ + 6 ਬਿੱਟ ਵਰਜਨ | 48 ਬਿੱਟ ਟਾਈਮਸਟੈਂਪ + 80 ਬਿੱਟ ਰੈਂਡਮ |
| ਕੇਸ | ਕੇਸ-ਸੈਂਸਟਿਵ (ਆਮ ਤੌਰ 'ਤੇ lowercase) | ਕੇਸ-ਸੈਂਸਟਿਵ | ਕੇਸ-ਇਨਸੈਂਸਟਿਵ |
| ਸੌਰਟੇਬਲ | ਨਹੀਂ (UUID v4 ਬੇਤਰਤੀਬ) | ਹਾਂ (ਮਿਲੀਸਕਿੰਟ ਸ਼ੁੱਧਤਾ) | ਹਾਂ (ਮਿਲੀਸਕਿੰਟ ਸ਼ੁੱਧਤਾ) |
| URL-ਸੁਰੱਖਿਅਤ | ਨਹੀਂ (ਹਾਈਫਨ, uppercase/lowercase) | ਨਹੀਂ (ਹਾਈਫਨ, uppercase/lowercase) | ਹਾਂ (ਕੋਈ ਐਸਕੇਪਿੰਗ ਨਹੀਂ) |
ULID UUID v7 ਨਾਲੋਂ 10 ਅੱਖਰ ਛੋਟਾ ਹੈ, ਅਤੇ UUID v4 ਦੇ 128-ਬਿੱਟ ਸਪੇਸ ਨੂੰ ਬਰਕਰਾਰ ਰੱਖਦਾ ਹੈ।
ਸਮਾਂ-ਕ੍ਰਮਬੱਧਤਾ: ULID ਕਿਵੇਂ ਕੰਮ ਕਰਦਾ ਹੈ?
ULID lexicographically sortable ਹੈ - ਇਹ ਟੈਕਸਟ A < AB < ABC ਵਾਂਗ ਸੌਰਟ ਹੁੰਦਾ ਹੈ। ਪਹਿਲੇ 10 ਅੱਖਰ ਟਾਈਮਸਟੈਂਪ ਹਨ, ਇਸ ਲਈ:
01ARZ3NDEK...(2021-01-01) <01BX5ZZKBK...(2021-02-01) <01CY6ZZKBK...(2021-03-01)
ਇਹ B-ਟ੍ਰੀ ਇੰਡੈਕਸ ਵਿੱਚ insertion performance ਨੂੰ ਸੁਧਾਰਦਾ ਹੈ - ਨਵੇਂ ID ਪੁਰਾਣੇ ID ਦੇ ਅੰਤ ਵਿੱਚ ਜੋੜੇ ਜਾਂਦੇ ਹਨ, Random UUID v4 ਨਾਲੋਂ।
ਮਹੱਤਵਪੂਰਨ: ULID ਇੱਕੋ ਮਿਲੀਸਕਿੰਟ ਵਿੱਚ ਤਿਆਰ ਕੀਤੇ ID ਲਈ ਸਖ਼ਤ ਕ੍ਰਮ ਦੀ ਗਰੰਟੀ ਨਹੀਂ ਦਿੰਦਾ। ਜੇਕਰ 100 ID ਇੱਕੋ ਮਿਲੀਸਕਿੰਟ ਵਿੱਚ ਤਿਆਰ ਕੀਤੇ ਜਾਂਦੇ ਹਨ, ਤਾਂ ਉਹ ਆਪਣੇ ਵਿੱਚ Random order ਵਿੱਚ ਹੋ ਸਕਦੇ ਹਨ।
80-ਬਿੱਟ ਰੈਂਡਮ: ਟੱਕਰ ਸੰਭਾਵਨਾ
80-ਬਿੱਟ ਰੈਂਡਮ (2^80 = 1.2 × 10^24) ULID ਨੂੰ ਬਹੁਤ ਘੱਟ ਟੱਕਰ ਸੰਭਾਵਨਾ ਦਿੰਦਾ ਹੈ।
- ਪ੍ਰਤੀ ਮਿਲੀਸਕਿੰਟ 1,000 ULID: 2^80 / (2 × 10^9 × 1,000)^2 ≈ 10^-12 (1 ਟੱਕਰ ਪ੍ਰਤੀ 10^12 ਮਿਲੀਸਕਿੰਟ)
- 1,000,000 ULID/ਸਕਿੰਟ: 10^-6 (1 ਮਿਲੀਅਨ ਮਿਲੀਸਕਿੰਟ, ~16.7 ਮਿੰਟ)
ਇਹ ULID ਨੂੰ distributed systems, microservices, high-traffic APIs ਲਈ ਸੁਰੱਖਿਅਤ ਬਣਾਉਂਦਾ ਹੈ।
URL-ਸੁਰੱਖਿਅਤ ਅਤੇ ਐਸਕੇਪਿੰਗ-ਮੁਕਤ
ULID 26-ਅੱਖਰ Crockford base32 (0-9, A-Z) RFC 3986 unreserved characters (A-Z, a-z, 0-9, hyphen, underscore, dot, tilde) ਨਾਲ ਪੂਰੀ ਤਰ੍ਹਾਂ ਅਨੁਕੂਲ ਹੈ। ਕੋਈ percent-encoding (URL encoding) ਜਾਂ escaping ਦੀ ਲੋੜ ਨਹੀਂ।
- UUID:
https://example.com/items/550e8400-e29b-41d4-a716-446655440000(hyphens, lowercase) - ULID:
https://example.com/items/01ARZ3NDEKTSV4RRFFQ69G5FAV(26-characters, case-insensitive, no hyphens)
B-ਟ੍ਰੀ ਇੰਡੈਕਸਿੰਗ: ULID vs UUID v4
Databases (PostgreSQL, MySQL) B-ਟ੍ਰੀ ਇੰਡੈਕਸ 'ਤੇ ਨਿਰਭਰ ਕਰਦੇ ਹਨ। B-ਟ੍ਰੀ insertion performance ਬਿਹਤਰ ਹੁੰਦੀ ਹੈ ਜਦੋਂ ID monotonically increasing (elderly values larger) ਹੁੰਦੇ ਹਨ।
- UUID v4 (random): New ID can point to any location (start, middle, end). This causes "page splits" and increased index maintenance.
- ULID (time-sortable): New ID always points to the end of the B-트리. No page splits, minimal index fragmentation.
Benchmarks show ULID can improve PostgreSQL write performance by 20-40% compared to UUID v4.
Local Generation and Privacy
ULID generation happens locally in your browser using crypto.getRandomValues(). Nothing is sent to any server. This means:
- Privacy: No server logs of generated IDs. Each ID is unique to your browser session.
- Speed: No network latency. Generate 100 ULID in microseconds.
- Offline: Works without internet.
Interface: Select format as ULID, enter count (1-100), click "Generate". Each ULID can be clicked to copy individually, or "Copy all" to copy the entire list.
FAQ (ਆਮ ਸਵਾਲ)
1. ULID vs UUID: ਕਿਹੜਾ ਬਿਹਤਰ?
ULID: 26 characters, case-insensitive, no hyphens, time-sortable, URL-safe. Better for primary keys in databases, public APIs, distributed systems. UUID v4: 36 characters, case-sensitive, hyphens, not sortable, not URL-safe. Better for legacy systems, standards compliance.
2. ਕੀ ULID 100% time-sortable?**
No. ULID is lexicographically sortable by creation time only for IDs generated in different milliseconds. IDs generated in the same millisecond may not be in strict order.
3. ULID vs NanoID: ਕਿਹੜਾ ਛੋਟਾ?
ULID: 26 characters (128-bit). NanoID: 21 characters (128-bit) or other lengths. ULID is time-sortable; NanoID is not.
4. ULID URL-safe?**
Yes. All 26 characters (Crockford base32) are unreserved in RFC 3986. No escaping needed.
5. ULID collision probability?
80-bit randomness: 2^80 possible values. For 1,000 ID/millisecond, collision probability is ~10^-12.
6. ULID vs UUID v7?
Both are time-sortable (48-bit timestamp). UUID v7: 36 characters, case-sensitive, hyphens, 74-bit randomness. ULID: 26 characters, case-insensitive, no hyphens, 80-bit randomness. ULID is smaller and case-insensitive.