Logo GH

Identifikatorlarni yaratish

1) Nega identifikatorlarga e’tibor berish kerak

Identifikator (ID) - mohiyatning asosiy kaliti: DQ satrlari, xabarlar, fayl, buyurtma. Uning xususiyatlariga quyidagilar bog’liq:
  • O’ziga xosligi va ko’lami (to’qnashuvlar, gorizontal o’sish).
  • Tartib va saralash (vaqtinchalik korrelyatsiya, replikatsiya, dedup).
  • Saqlash quvvati (indekslar, issiq sahifalar, kalit oʻlchami).
  • Xavfsizlik (oldindan aytib bo’lmaydigan, oqish, taxmin qilish).
  • Foydalanuvchanlik/integratsiya (qisqa, URL-safe, registrga sezgir emas).

ID tanlash - entropiya, tartibga solinish, uzunlik, ishlab chiqarish tezligi va foydalanish o’rtasidagi murosadir.

2) Asosiy talablar va atamalar

O’ziga xoslik: qarama-qarshilik ehtimoli maqbul xavfdan past bo’lishi kerak.
Entropiya: «qancha baxtsiz hodisalar» ID (bit) ni o’z ichiga oladi.
Tartibga solinishi (time-sortable/k-sortable): leksikografik saralash ≈ vaqt boʻyicha saralash.
Monotoniya: tugun/oqim ichidagi ketma-ketlik.
Yozuvning lokalizmi: yangi ilova indeksning «dumida» qancha toʻplangan (issiq sahifalar xavfi).
Oldindan aytish mumkin: qo’shni ID (xavfsizlik/API) ni taxmin qilish mumkinmi?
Taqdimot: binar/satr, Base16/32/36/58/64, defis, registr.

3) Identifikatorlarning asosiy oilalari

3. 1 UUID

v4 (random): 122 entropiya biti. Tartibsiz, xavfsizlik va soddalik uchun yaxshi. Minus: tasodifiy taqsimot tufayli indekslar «tartibsiz» bo’lib qoladi - ammo bu yuklarni bir tekis tarqatib yuboradi va «issiq sahifalar» ni olib tashlaydi.
v1 (time + MAC): tartibga solamiz, lekin MAS/vaqt (maxfiylik) olib boradi; ko’pincha qochishadi.
v7 (time-ordered): millisekundlik vaqt + random qismi. Zamon bo’yicha leksikografik saralash va DBda yaxshi siqish uchun dizayn. Murosa: indeksning «issiq dumi» paydo bo’ladi; shardatsiya/prekf/inkrement bilan davolanadi.

Maslahatlar

Tashqi API va tartibga qo’yiladigan qat’iy bo’lmagan talablar uchun - v4.
Hodisa/log DB va «saralanadigan» kalitlar uchun - v7.

3. 2 ULID (Crockford Base32)

128 bit: 48 bit vaqt (ms) + 80 bit tasodifiy. Leksikografik jihatdan vaqtga qarab saralanadi, insonparvar (’I, L, O, U’), URL-safe. Bir xil vaqt belgisi bilan tasodifiy qismi kattalashadi.
Afzalliklari: o’qish, tartibga solish, chidamlilik.
Kamchiliklar: qo’shimchalar chastotasi juda yuqori bo’lganda, bir vaqtda - «issiq quyruq».

3. 3 KSUID

160 bit: 32 bit vaqt (sek) + 128 bit tasodifiy davr. Katta vaqt oralig’i va barqaror saralanishi, ULIDdan qisqa satrlar? (yo’q - uzunroq, lekin kodlash bilan), taqsimlangan loglar va obyektlar uchun yaxshi.

3. 4 Snowflake-ga o’xshash (k-sortable flake IDs)

Klassik sxema (sozlanadigan):

[ timestamp bits ][ region/datacenter bits ][ worker bits ][ sequence bits ]

Xossalari: uzelda monoton o’sish, kvazi-global o’ziga xoslik, qisqa (64 bit) binar ko’rinish.
Xavflar: soatga bog’liqlik (vaqt dreyf/regress), bir tikda sequence tugashi, region/worker bitlarini muvofiqlashtirish.
Davolanadi: «clock back» dan himoyalanish, sequence zaxirasi, vaqt detektori, PTP/NTP intizomi.

3. 5 DB ketma-ketligi (SEQUENCE/IDENTITY)

Bitta MBB/shardda eng oddiy monoton avlod.
Ijobiy tomonlari: qisqa, tez, mahalliy jadvallar uchun qulay.
Kamchiliklar: global miqyosda taqsimlangan klasterda qiyin; oldindan aytib bo’lmaydigan (ommaviy kalit kabi xavfli), indeksning issiq dumini yaratadi.

3. 6 Kontent-manzilli ID (hash content)

Tarkibidan SHA-256/Blake3 → barqaror ID, deduplikatsiya, yaxlitlikni tekshirish, keshlash.
Afzalliklari: determinizm, almashtirishdan himoya qilish.
Minuslar: qimmatbaho avlod (CPU), amaliy nol to’qnashuvlar, vaqtinchalik saralash yo’q, uzunligi.

4) To’qnashuvlar va «tug’ilgan kunlar paradoksi» (intuitiv)

’n’ generatsiyalarda’b’bitning tasodifiy ID hajmi uchun qarama-qarshilik ehtimoli taxminan:

p ≈ 1 - exp (-n (n-1 )/2/2 ^ b) ≈ n ^ 2/2 ^ (b + 1) (for small p)
Misollar:
  • UUIDv4 (122 bit) n = 10 ^ 12 (trillion) → p ~ 1e-14 (e’tiborsiz).
  • 64 bitli random → n = 10 ^ 9 bo’lganda allaqachon p ~ 0. 027 (sezilarli xavf).
  • Xulosa: 64-bit tasodifiy ko’pincha ulkan tizimlar uchun kam; 96/128 bitdan foydalaning.

5) Indekslar, issiq sahifalar va saqlash

Tasodifiy kalitlar (v4) indeksning yog’och bo’yicha qo’shimchalarni teng taqsimlaydi → «dumi» yo’q, lekin kesh lokalizmi yomonroq.
Vaqt boʻyicha saralanadigan (v7/ULID/Snowflake) «dumga» kiritiladi → eng yaxshi lokallik va siqish, lekin yuqori parallel yozuvdagi issiq sahifalar xavfi.

Issiq dumni yumshatish:
  • prefikslar/tenant/region bo’yicha sharding (vaqtdan oldin 1-2 bayt qo’shish);
  • interleaving: katta bitlardagi tasodifning bir qismi;
  • batch-qo’shimchalar, B-yog’ochdagi fillfactor, BRINga o’tish/katta loglar uchun klaster.
Oʻlchami muhim:
  • ’UUID (16B)’ vs’BIGINT (8B) ’/’ INT8’xotirani/keshni tejaydi; Base32/58/64 satrlari o’lchamni 20-60% ga oshiradi. DB uchun ikkilanib saqlang, chetidagi qatorga seriyalashtiring.

6) Xavfsizlik va maxfiylik

SEQUENCE/INT’dan URL/API’da ommaviy ID sifatida foydalanmang: taxmin qilinadigan → manbalar roʻyxati.
Tashqi havolalar uchun random, oldindan aytib boʻlmaydigan ID (v4/v7/ULID/KSUID) larni qoʻshing.
PIIni IDga kodlamang. Agar siz atributni yoqishingiz kerak boʻlsa, uni shifrlang/imzolang (masalan, JWE/JWS) yoki shaffof boʻlmagan tokenlardan foydalaning.
URL xavfsiz kodlash: Base32 Crockford, Base58 (’0OIl’dan tashqari), Base64url.

7) Ko’p tenantlik, prefikslar va yo’nalishlar

Formati:’[TENANT _ PREFIX] - [ID]’yoki binar:’tenant _ id | | id’.
Afzalliklari: ijarachi bo’yicha tezkor filtrlar/partiyalar, N + 1 skanerdan himoya qilish.
Salbiy tomonlari: katta bitlarda entropiya zichligi yomonlashishi mumkin → taqsimotni o’ylab ko’ring (hesh prefiks).
Hash qoʻshimchasi (2-3 bayt) qarama-qarshiliklarni kamaytiradi va shard-routingga yordam beradi:’shard = hash (id)% N’.

8) Tanlash bo’yicha amaliy tavsiyalar

API, ommaviy havolalar, qatʼiy tartibsiz taqsimlangan servislar: UUIDv4, ULID/KSUID.
Ko’pincha vaqt bo’yicha saralanadigan loglar/hodisalar/buyurtmalar: UUIDv7 yoki ULID (monoton).
Lokal monotonligi va qisqa kalitli ultra yuqori ruxsatnoma: Snowflake kabi 64-bit (vaqt intizomi talab qilinadi).
Artefaktlar/bildlar/bloblar omborxonalari: manzilli kontent (SHA-256), ustiga esa - insonparvar qisqa «vitrin» (Hashids/havola).
Bitta DBdagi lokal jadvallar: SEQUENCE/IDENTITY + ochiq havolalar uchun tashqi «oʻrash» (masking).

9) Amalga oshirish va misollar

9. 1 PostgreSQL

UUIDni binar holda saqlang, indekslar -’btree’yoki’hash’.

sql
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

CREATE TABLE orders (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(), -- или uuid_generate_v4()
created_at timestamptz NOT NULL DEFAULT now(),
tenant smallint NOT NULL
);

-- For time-sortable (UUIDv7) store binary (uuid), generation in the application.
-- If you want a cluster by time:
CREATE INDEX ON orders (created_at DESC);
Sequential hot fix: time-sorted ID uchun katta bitlarga «tuz» qo’shing yoki tenant bo’yicha partizan qiling:
sql
CREATE TABLE orders_t1 PARTITION OF orders FOR VALUES IN (1);
CREATE TABLE orders_t2 PARTITION OF orders FOR VALUES IN (2);

9. 2 Redis (atomar hisoblagichlar/monutoniya)

bash
INCR "seq: orders" # local sequence combine: epoch_ms<<20     (worker_id<<10)      (seq & 1023)

9. 3 Snowflake oʻxshash generator (psevdokod)

pseudo const EPOCH =  1704067200000  # custom epoch (ms)
state: last_ms=0, seq=0, worker=7, region=3

next():
now = epoch_ms()
if now < last_ms: wait_until(last_ms)    # защита от clock back if now == last_ms:
seq = (seq + 1) & ((1<<12)-1)      # 12 бит if seq == 0: wait_next_ms()
else:
seq = 0 last_ms = now return (now-EPOCH)<<22      region<<17      worker<<12      seq

9. 4 ULID/UUID ilovalarda

Go

go
// ULID t:= time. Now(). UTC()
entropy:= ulid. Monotonic(rand. New(rand. NewSource(t. UnixNano())), 0)
id:= ulid. MustNew(ulid. Timestamp(t), entropy)

//UUID v7 (if there is a library)
id:= uuid. Must(uuid. NewV7())

Node. js

js import { ulid } from 'ulid';
import { v4 as uuidv4 } from 'uuid';
const id1 = ulid();
const id2 = uuidv4(); // v4

Python

python import uuid, time id_v4 = uuid. uuid4()
For v7, use a library (for example, uuid6/7 third-party packages)

10) Kodlash va taqdimnomalar

Binarno DB (’BYTEA’,’UUID’) → ixcham va tez. Chetini quyidagiga aylantiring:
  • Base32 Crockford (ULID): registrga sezgisiz, vizual oʻxshash belgilarsiz.
  • Base58: qisqacha Base32/64 o’qiladigan tokenlar uchun URL-safe.
  • Base64url: qisqa, lekin’-’va’_’URLda.

Satrlarni solishtirishda dublikatlardan qochish uchun harf va formatni (defislar/ularning yoʻqligi) barqarorlashtiring.

11) Test-pleybuklar va kuzatuvchanlik

To’qnashuvlar:’id _ collision _ total’metrikasi (0 bo’lishi kerak),> 0 da alert.
Prefikslarni taqsimlash: katta baytlarning gistogrammasi - sotib olishni qidirmoqdamiz.
Ishlab chiqarish tezligi:’ids _ per _ sec’, p99 latentlik generator.
Clock skew (Snowflake uchun): tugunlar ofseti, «clock went back» hodisalari.
Indeks qoldiqlari: p95/p99’INSERT’latency; blokirovka/issiq sahifalar ulushi.

Game day:
  • Injekt «clock drift/back» → generator kutayotganiga ishonch hosil qiling.
  • ’Sequence’ ning millisekundda toʻlishi → Kutishni tekshirish next_ms.
  • Ommaviy parallellik → indeksda blokirovka boʻronlari yoʻq.

12) Anti-patternlar

Ommaviy ID sifatida AUTO_INCREMENT/SEQUENCE: taxmin qilinmoqda, sizib chiqmoqda. Ichki identifikatorning oshkora shaffof boʻlmagan identifikatoridan foydalaning.
UUIDv1 (MAS/vaqt) tashqariga: maxfiylik.
Trillionlab yozuvlar uchun 64 bitli tasodifiy ID: haqiqiy qarama-qarshilik xavfi.
HA: SPOF va tor joysiz global «markaziy generator».
clock back himoyasiz Time-sorted IDs: dublikatlar/regress tartibi.
Ochiq versiya/prefikssiz turli ID formatlarini aralashtirish → Debag/migratsiyalarda xaos.
ID’ni turli registrlar/shakllarga ega satrlar sifatida saqlash → yashirin dublikatlar.

13) Joriy etish chek-varaqasi

  • Domen talablari uchun v4/v7/ULID/KSUID/Snowflake/SEQ/hash formati tanlangan.
  • Tartibga qo’yiladigan talablar aniqlandi (saralanishi kerakmi).
  • Qarama-qarshiliklar ehtimoli baholandi (b bit, n avlod) va xavf chegarasi belgilandi.
  • Kodlash ishlab chiqilgan (BD + odamni o’qiydigan vitrinada binar).
  • time-sorted uchun - clock back himoyasi, sequence-limitlar va NTP/PTP intizomi.
  • Ommaviy ID uchun - oldindan aytib bo’lmaydigan (random/ULID/KSUID), PII yo’qligi.
  • O’ylangan shard-routing (hash (id)% N), ko’p tenant prefikslar.
  • Kuzatish darajasi: qarama-qarshilik, taqsimot, kechikish, clock skew metrikasi.
  • Sequence/yuqori raqobat/deraza uzunligini to’ldirish uchun test-keyslar.
  • Format, versiya, davr, bitli belgilar hujjatlari va migratsiya rejasi.

14) FAQ

Q: Mikroservislar uchun «andoza» nimani tanlash kerak?
A: UUIDv7 yoki ULID: vaqt tartibliligi, ko’p entropiya, chekkada oddiy avlod. Tashqi API uchun - ULID/UUIDv4 ham.

Q: Sizga qisqa va o’qiladigan ID kerak.
A: ULID/KSUID yoki Base58-kodlash 128-bit tasodifiy/vaqtinchalik ID. Uzunlik va to’qnashuvlarni eslang.

Q: «Qisqa raqamli» ID qilish mumkinmi, lekin xavfsiz?
A: Ha: ichki SEQni saqlang va opaque tokenini (96-128 bit rand) yoki Xashidsni tuz bilan + imzo bilan bering.

Q: SEQ dan UUIDv7 ga qanday ko’chish mumkin?
A: Yangi’id _ new’(UUID) ustunini kiriting, dublyaj qiling, yangi ID’ga havolalarni e’lon qiling, keyin RK/tashqi kalitlarni o’zgartiring va eskisini o’chirib tashlang.

Q: Nega ULID qo’shimchalarim «issiq» bo’lib qoldi?
A: O’sib borayotgan kalitlarni bitta indeksga qo’ying. Katta bitlarni aralashtiring, batch qo’shimchalaridan foydalaning.

15) Yakunlar

Yaxshi ID - bu vazifa uchun to’g’ri xususiyatlar to’plami: etarlicha entropiya, oldindan aytib bo’ladigan saralash (agar kerak bo’lsa), xavfsiz oshkoralik va indekslardan sog’lom foydalanish. Soddalik va taqsimot uchun UUIDv4/ULID/UUIDv7/KSUID tanlang, Snowflake - zich monotoniya va qisqa kalitlar uchun (vaqt tartibi bo’yicha), ketma-ketlik - mahalliy jadvallar uchun, kontent xeshlari - artefaktlar uchun. Kuzatuv va testlarni belgilang va identifikatorlar kutilmagan hodisalar manbai bo’lib qolmaydi.

Contact

Biz bilan bog‘laning

Har qanday savol yoki yordam bo‘yicha bizga murojaat qiling.Doimo yordam berishga tayyormiz.

Integratsiyani boshlash

Email — majburiy. Telegram yoki WhatsApp — ixtiyoriy.

Ismingiz ixtiyoriy
Email ixtiyoriy
Mavzu ixtiyoriy
Xabar ixtiyoriy
Telegram ixtiyoriy
@
Agar Telegram qoldirilgan bo‘lsa — javob Email bilan birga o‘sha yerga ham yuboriladi.
WhatsApp ixtiyoriy
Format: mamlakat kodi va raqam (masalan, +998XXXXXXXX).

Yuborish orqali ma'lumotlaringiz qayta ishlanishiga rozilik bildirasiz.