Identifikatorlary döretmek
1) Nämä identifikatorlara üns bermeli?
Identifikator (ID) - düýp many açary: DB setirleri, habarlar, faýl, sargyt. Onuň häsiýetlerine bagly:- Özboluşlylygy we gerimi (gapma-garşylyklar, gorizontal ösüş).
- Tertip we sortlamak (wagtlaýyn korrelýasiýa, replikasiýa, dedup).
- Saklaýyş öndürijiligi (indeksler, gyzgyn sahypalar, açaryň ululygy).
- Howpsuzlyk (öňünden aýdyp bolmajaklyk, syzmak, çaklamak).
- Ulanyş/integrasiýa (gysga, URL-safe, registre duýgur däl).
ID saýlamak - entropiýa, tertiplilik, uzynlyk, nesil tizligi we ekspluatasiýa arasynda ylalaşyk.
2) Esasy talaplar we adalgalar
Özboluşlylygy: gapma-garşylygyň ähtimallygy kabul ederlikli töwekgelçilikden pes bolmaly.
Entropiýa: "Näçe tötänlik" ID (bit) bar.
Tertipliligi (time-sortable/k-sortable): leksikografik sortlamak ≈ wagt boýunça sortlamak.
Monotony: düwün/akymyň içinde azalmaýan yzygiderlilik.
Ýazgynyň ýerleşýän ýeri: täze goýmanyň indeksiň "guýrugynda" jemlenişi (gyzgyn sahypalaryň howpy).
Öňünden aýdylýanlygy: goňşy şahsyýetnamany çaklamak mümkinmi (howpsuzlyk/API üçin möhümdir).
Görkeziş: binar/setirli, Base16/32/36/58/64, defisler, registrler.
3) Kesgitleýjileriň esasy maşgalalary
3. 1 UUID
v4 (random): 122 entropiýa bit. Tertipsiz, howpsuzlyk we ýönekeýlik üçin amatly. Minus: tötänleýin paýlanyş sebäpli indeksler "bulam-bujar" - bu bolsa ýükleri deň derejede dargatýar we "gyzgyn sahypalary" aýyrýar.
v1 (wagt + MAC): tertipleşdirýäris, ýöne AAC/wagt (gizlinlik) göterýär; köplenç gaçýarlar.
v7 (wagt-ordered): millisekund wagt + random bölegi. Wagt boýunça leksikografiki sortlama we DB-de gowy gysyş üçin dizaýn. Ylalaşyk: indeksiň "gyzgyn guýrugy" peýda bolýar; şardlamak/prefiks/inkrement bilen bejerilýär.
Maslahatlar
Daşarky API we tertibe bildirilýän berk talaplar üçin - v4.
Waka/DB we "sortlanan" açarlar üçin - v7.
3. 2 ULID (Crockford Base32)
128 bit: 48 bit wagt (ms) + 80 bit tötänlik. Leksikografiki taýdan wagt boýunça sortlanýar, adam-dost ('I, L, O, U'), URL-safe. Monoton üýtgeşiklik bar (şol bir wagt belligi bilen tötänleýin bölegi köpelýär).
Artykmaçlyklary: okalmagy, tertipleşdirilmegi, çydamlylygy.
Minuslar: bir wagtyň özünde gaty ýokary ýygylykda - "gyzgyn guýruk".
3. 3 KSUID
160 bit: 32 bit wagt (sek) döwür bilen deňeşdirilende + 128 bit tötänlik. ULID-den gysga çyzyklar, has uly wagt aralygy we durnukly sortlanyş? (ýok - has uzyn, ýöne kodlamak bilen), paýlanan bloglar we obýektler üçin amatly.
3. 4 Snowflake-meňzeş (k-sortable flake IDs)
Nusgawy shema (sazlanyp bilinýän):
[ timestamp bits ][ region/datacenter bits ][ worker bits ][ sequence bits ]
Häsiýetleri: düwündäki monoton ösüş, kwazi-global özboluşlylyk, gysga (64 bit) binar görnüş.
Töwekgelçilikler: sagatlara garaşlylyk (wagt süýşmesi/regress), bir tikde sekwensiýanyň tükenmegi, region/worker bitleriniň utgaşdyrylmagy.
Bejergi: "clock back" -dan goramak, segquence ätiýaçlygy, wagt detektory, PTP/NTP düzgün-nyzam.
3. 5 DB yzygiderliligi (SEQUENCE/IDENTITY)
Bir DBB/çarda iň ýönekeý monoton nesil.
Plýuslar: gysga, çalt, ýerli tablisalar üçin amatly.
Minuslar: paýlanan toparda global taýdan kyn; öňünden aýdyp boljak (köpçüligiň açary ýaly howply), indeksiň gyzgyn guýrugyny döredýär.
3. 6 Mazmun-salgy ID (hash content)
Mazmundan SHA-256/Blake3 → durnukly ID, de-duplikasiýa, bitewiligi barlamak, kesmek.
Artykmaçlyklary: determinizm, çalyşmakdan goramak.
Minuslar: gymmat bahaly nesil (CPU), amaly nol gapma-garşylyklar, wagtlaýyn sortlama ýok, uzynlyk.
4) Gapma-garşylyklar we "doglan günleriň paradoksy" (duýgur)
"b" bit ululygyndaky tötänleýin ID üçin gapma-garşylyk ähtimallygy "n" generasiýalarda takmynan:
p ≈ 1 - exp (-n (n-1 )/2/2 ^ b) ≈ n ^ 2/2 ^ (b + 1) (for small p)
Mysal üçin:
- UUIDv4 (122 bit) n = 10 ^ 12 (trillion) → p ~ 1e-14 (äsgerilmez).
- 64-bit random → nde = 10 ^ 9 eýýäm p ~ 0. 027 (görnükli töwekgelçilik).
- Netije: 64-bit tötänleýin köplenç ullakan ulgamlar üçin ýeterlik däl; 96/128 bit ulanyň.
5) Indeksler, gyzgyn sahypalar we saklamak
Tötänleýin açarlar (v4) bellikleri indeksiň agajyna birmeňzeş paýlaýar → "guýrugy" ýok, ýöne has erbet kesh lokalizasiýasy.
Wagt boýunça sortlanýanlar (v7/ULID/Snowflake) "guýrugyna" girizilýär → iň gowy lokalizasiýa we gysyş, ýöne ýokary paralel ýazgynyň aşagyndaky gyzgyn sahypalaryň töwekgelçiligi.
- tenant/region boýunça prefiksler/şarding (wagtdan öň 1-2 baýt goşmak);
- interleaving: uly bitlerde tötänligiň bir bölegi;
- batch-goşmalar, B-agaçdaky fillfactor, uly bloglar üçin BRIN/klaster üçin awtoulag geçişi.
- 'UUID (16B)' vs 'BIGINT (8B) '/' INT8' ýady/keşi tygşytlaýar; Base32/58/64 setirleri ululygy 20-60% ýokarlandyrýar. DB üçin ikilik saklaň, gyradaky setirde seriýalaň.
6) Howpsuzlyk we gizlinlik
SEQUENCE/INT-i URL/API-de köpçülige açyk ID hökmünde ulanmaň: çaklamak → çeşmeleriň sanalmagy.
Daşarky baglanyşyklar üçin tötänleýin, öňünden aýdyp bolmajak ID (v4/v7/ULID/KSUID) goşuň.
PII-ni şahsyýetnamada kodlamaň. Atributy açmaly bolsaňyz, şifrläň/gol çekiň (JWE/JWS ýaly) ýa-da aç-açan däl bellikleri ulanyň.
URL-howpsuz kodlamalar: Base32 Crockford, Base58 ('0OIl' -siz), Base64url.
7) Köp tenantlyk, prefiksler we marşrut
Format: '[TENANT _ PREFIX] - [ID]' ýa-da ikilik: 'tenant _ id | | id'.
Plýuslar: kärendeçi boýunça çalt süzgüçler/partiýalar, N + 1 skandan gorag.
Minuslar: uly bitlerdäki entropiýanyň dykyzlygyny hasam erbetleşdirip biler → paýlanyşy pikirleniň (heş prefiks).
Hash goşulmasy (2-3 baýt) gapma-garşylyklary peseldýär we shard-routinge kömek edýär: 'shard = hash (id)% N'.
8) Saýlamak boýunça amaly teklipler
API, jemgyýetçilik baglanyşyklary, berk tertipsiz paýlanan hyzmatlar: UUIDv4, ULID/KSUID.
Logi/wakalar/sargytlar, köplenç wagt boýunça tertipleşdirýäris: UUIDv7 ýa-da ULID (monoton).
Lokal monotonlygy we gysga açary bolan ultra ýokary giriş: Snowflake-meňzeş 64-bit (wagt tertibi talap edilýär).
Artefaktlaryň/binalaryň/bloblaryň ammarlary: mazmun-salgylar (SHA-256), üstleri bolsa adam-dost gysga "vitrin" (Hashids/baglanyşyk).
Bir DB-de lokal tablisalar: SEQUENCE/IDENTITY + açyk baglanyşyklar üçin daşarky "örtük" (masking).
9) Ýerine ýetirişler we mysallar
9. 1 PostgreSQL
UUID-i binar saklaň, indeksler - 'btree' ýa-da '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 üçin uly bitlere "duz" goşuň ýa-da tenant boýunça partiýa ediň:
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 (atom hasaplaýjylary/monutoniýa)
bash
INCR "seq: orders" # local sequence combine: epoch_ms<<20 (worker_id<<10) (seq & 1023)
9. 3 Snowflake şuňa meňzeş 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 programmalarda
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) Kodlaşdyrmalar we teklipler
BD ('BYTEA', 'UUID') → ykjam we çalt. Gyrada:- Base32 Crockford (ULID): registre duýgur däl, wizual meňzeş nyşanlar ýok.
- Base58: gysgaça Base32/64 adam okaýan tokenler üçin, URL-safe.
- Base64url: gysga, ýöne URL-de '-' we '_'.
Setirleri deňeşdireniňizde dublikatlardan gaça durmak üçin registri we formaty (defisler/olaryň ýoklugy) durnuklaşdyryň.
11) Synag-pleýbuklar we gözegçilik etmek
Gapma-garşylyklar: metrika 'id _ collision _ total' (0 bolmaly), alert> 0.
Prefiksleriň paýlanyşy: uly baýtlaryň gistogrammasy - satyn alyjylary gözleýäris.
Öndüriş tizligi: 'ids _ per _ sec', p99 gizlinlik generatory.
Clock skew (Snowflake üçin): düwünleriň ofseti, "clock went back" wakalary.
Indeks guýruklary: p95/p99 'INSERT' latency; blokirlemeleriň/gyzgyn sahypalaryň paýy.
- Inject "clock drift/back" → generatoryň garaşýandygyna/geçýändigine göz ýetirýäris.
- Миллисекундda 'sequence' dolmagy → Garaşmagyň barlagy next_ms.
- Köpçülikleýin paralellik → Indeksde gulplama tupanlarynyň ýoklugy.
12) Anti-patternler
Jemgyýetçilik ID hökmünde AUTO_INCREMENT/SEQUENCE: çaklamak, syzmak. Içiňkiniň üstünde aç-açan däl şahsyýetnamany ulanyň.
UUIDv1 (IAS/wagt): gizlinlik.
Trillionlarça ýazgy üçin 64-bit tötänleýin ID: hakyky gapma-garşylyk töwekgelçiligi.
HA: SPOF we dar ýeri bolmadyk global "merkezi generator".
Clock back goragsyz wagt-sorted IDs: dublikatlar/regress tertibi.
Açyk wersiýasy/prefiksi bolmazdan dürli ID formatlaryny garyşdyrmak → debag/migrasiýalarda bulam-bujarlyk.
ID-ni dürli registrli/şekilli setirler hökmünde saklamak → gizlin dublikatlar.
13) Girizmegiň çek-sanawy
- Domen talaplary üçin format (v4/v7/ULID/KSUID/Snowflake/SEQ/hash) saýlandy.
- Tertibe bildirilýän talaplar kesgitlenildi (sortlanmak zerurmy).
- Gapma-garşylyklaryň ähtimallygyna baha berildi (b bit, n nesil) we töwekgelçilik çäkleri berildi.
- Kodirleme (BD-de binar + adam okaýan vitrin).
- Wagt-sorted üçin - clock back, sequence-limits we NTP/PTP düzgün-nyzam goragy.
- Köpçüligiň şahsyýetnamasy üçin - öňünden aýdyp bolmajak (random/ULID/KSUID), PII ýoklugy.
- Şard-routing (hash (id)% N), köp tenant prefiksleri oýlandy.
- Gözegçilik derejesi: gapma-garşylyklaryň, paýlanyşyň, gijikdirmeleriň, gijikdirmeleriň metrikleri.
- Synagyň aşa köp bolmagy/ýokary bäsdeşlik/penjiräniň uzynlygy üçin synag ýagdaýlary.
- Format, wersiýa, döwür, bit bellikleri we migrasiýa meýilnamasy.
14) FAQ
Q: Mikroservisler üçin "standart" näme saýlamaly?
A: UUIDv7 ýa-da ULID: wagt tertibi, köp entropiýa, gyrada ýönekeý nesil. Daşarky API üçin - ULID/UUIDv4 hem okal.
Q: Size gysga we okalýan şahsyýet gerek.
A: ULID/KSUID ýa-da Base58-kodlamak 128-bit tötänleýin/wagtlaýyn ID. Uzynlygy we gapma-garşylyklary ýada salyň.
Q: "Gysga san" şahsyýetnamasyny edip bolarmy, ýöne howpsuz?
A: Hawa: içerki SEQ saklaň we opaque tokenini (96-128 bit rand) ýa-da duzly Hashids + gol beriň.
Q: SEQ-den UUIDv7-e nädip göçmeli?
A: Täze 'id _ new' (UUID) sütünini giriziň, iki gezek ädim ätiň, täze şahsyýetnama baglanyşyklary çap ediň, soňra RK/daşarky açarlary geçiriň we köne açarlary aýyryň.
Q: Näme üçin ULID goşundylarym "gyzgyn" boldy?
A: Bir indeksde berk ösýän açarlary goýýarsyňyz. Partiýa/tenant bölüň, uly bitleri garyşdyryň, batch goşundylaryny ulanyň.
15) Netijeler
Gowy ID, wezipe üçin dogry häsiýetleriň toplumydyr: ýeterlik entropiýa, öňünden aýdyp boljak sortlama (zerur bolsa), howpsuz köpçülige aýan etmek we indeksleri sagdyn ulanmak. Ýönekeýlik we paýlanyş üçin UUIDv4/ULID/UUIDv7/KSUID saýlaň, dykyz monotoniýa we gysga açarlar üçin Snowflake (wagt tertibi bilen), ýerli tablisalar üçin yzygiderlilik, artefaktlar üçin mazmun heşleri. Synlamak we synlamak üçin bellik ediň - we kesgitleýjiler garaşylmadyk bir çeşme bolmagyny bes eder.