എന്താണ് UUID v7, എന്തുകൊണ്ട് ഇത് പ്രധാനമാണ്?
UUID v7 എന്നത് ഒരു 128-ബിറ്റ് ഐഡന്റിഫയറാണ്, 36-അക്ഷര സ്ട്രിംഗായി പ്രതിനിധീകരിക്കുന്നു (ഉദാ: 018f3a6e-7b3a-7b3a-8b3a-7b3a7b3a7b3a). ഇതിന്റെ ഘടന രണ്ട് ഭാഗങ്ങൾ ചേർന്നതാണ്: ആദ്യത്തെ 48 ബിറ്റുകൾ ഒരു Unix മില്ലിസെക്കൻഡ് ടൈംസ്റ്റാമ്പ് ആണ്, ബാക്കിയുള്ള 80 ബിറ്റുകൾ ശക്തമായ റാൻഡം ബിറ്റുകളും ചില വേർഷൻ/വേരിയന്റ് ഫീൽഡുകളും ആണ്. ഈ കോമ്പിനേഷൻ UUID v7-നെ രണ്ട് പ്രധാന ഗുണങ്ങൾ നൽകുന്നു: സൃഷ്ടിച്ച സമയം അനുസരിച്ച് ക്രമീകരിക്കാനുള്ള കഴിവ് (chronological sortability), ഒപ്പം ഊഹിക്കാൻ കഴിയാത്ത റാൻഡം നെസ്സും (unguessability). ഡാറ്റാബേസുകളിൽ, പ്രത്യേകിച്ച് B-ട്രീ ഇൻഡെക്സുകൾ ഉപയോഗിക്കുമ്പോൾ, UUID v4 പോലുള്ള പൂർണ്ണമായും റാൻഡം ഐഡികൾ ഇൻഡെക്സ് ഫ്രാഗ്മെന്റേഷൻ ഉണ്ടാക്കുന്നു. വിതരണം ചെയ്ത സിസ്റ്റങ്ങളിൽ ക്രമീകരിക്കാവുന്ന ഐഡികൾ ഇൻസേർട്ട് പെർഫോമൻസ് മെച്ചപ്പെടുത്തുന്നു — പുതിയ റെക്കോർഡുകൾ ഒരേ ഡിസ്ക് ബ്ലോക്കിൽ അടുത്തടുത്തായി എഴുതാൻ കഴിയും. UUID v7-ന്റെ പ്രധാന പരിമിതി, ഒരേ മില്ലിസെക്കൻഡിൽ സൃഷ്ടിച്ച ID-കൾക്ക് കർശനമായ ക്രമം ഉറപ്പില്ല എന്നതാണ്. കാരണം ടൈംസ്റ്റാമ്പ് ഒന്നുതന്നെയാണെങ്കിൽ, ബാക്കിയുള്ള റാൻഡം ബിറ്റുകൾ ക്രമം നിർണ്ണയിക്കുന്നു. ഇത് പാരലലിസവും അൺഗസബിലിറ്റിയും ബാലൻസ് ചെയ്യാനുള്ള ഒരു ട്രേഡ്-ഓഫ് ആണ്. വിതരണം ചെയ്ത സിസ്റ്റങ്ങളിൽ, ഒന്നിലധികം നോഡുകൾ ഒരേ മില്ലിസെക്കൻഡിൽ ID-കൾ സൃഷ്ടിക്കുമ്പോൾ, ക്രമം റാൻഡം ആയിരിക്കും. ഇത് അത്ര പ്രശ്നമല്ല, കാരണം മിക്ക ആപ്ലിക്കേഷനുകളും മില്ലിസെക്കൻഡ് തലത്തിലുള്ള ക്രമം മതിയാകും.
ഈ പേജ് എങ്ങനെ പ്രവർത്തിക്കുന്നു?
ഈ പേജ് ഒരു ലളിതമായ ഇന്റർഫേസ് നൽകുന്നു: നിങ്ങൾക്ക് 1 മുതൽ 100 വരെ എത്ര ID-കൾ വേണമെന്ന് തിരഞ്ഞെടുക്കാം, കൂടാതെ രണ്ട് ടോഗിളുകൾ — Uppercase (വലിയ അക്ഷരത്തിൽ കാണിക്കുക) ഒപ്പം Include hyphens (ഹൈഫണുകൾ ഉൾപ്പെടുത്തുക). ഈ ഓപ്ഷനുകളിൽ ഏതെങ്കിലും മാറ്റിയാൽ, ഉടനടി എല്ലാ ID-കളും പുനരുത്പാദിപ്പിക്കപ്പെടും. ജനറേഷൻ പൂർത്തിയായ ശേഷം, "Generated." എന്ന സ്റ്റാറ്റസ് കാണിക്കും. "Ready." എന്നത് ഐഡിൽ സ്റ്റേറ്റ് ആണ്. "Copied all!" എന്നത് എല്ലാ ID-കളും ഒരുമിച്ച് ക്ലിപ്പ്ബോർഡിലേക്ക് കോപ്പി ചെയ്യുമ്പോൾ കാണിക്കുന്ന സന്ദേശമാണ്. ഓരോ ID-യും വ്യക്തിഗതമായി ക്ലിക്ക് ചെയ്ത് കോപ്പി ചെയ്യാം. എല്ലാ ID-കളും ബ്രൗസറിൽ തന്നെ ലോക്കലായി ജനറേറ്റ് ചെയ്യപ്പെടുന്നു — ഒരു വിവരവും BroBroGo സെർവറിലേക്ക് അയക്കുന്നില്ല. ഇത് സ്വകാര്യത ഉറപ്പുവരുത്തുന്നു, കൂടാതെ ഇന്റർനെറ്റ് കണക്ഷൻ ഇല്ലാതെയും പ്രവർത്തിക്കുന്നു. ജനറേഷനായി ബ്രൗസറിന്റെ crypto.getRandomValues() പോലുള്ള ശക്തമായ റാൻഡം ജനറേറ്റർ ഉപയോഗിക്കുന്നു. ഔട്ട്പുട്ട് 36-അക്ഷര സ്ട്രിംഗുകളുടെ ഒരു ലിസ്റ്റ് ആയിരിക്കും. ഹൈഫണുകൾ ഇല്ലാത്ത ഓപ്ഷൻ തിരഞ്ഞെടുത്താൽ, ID-കൾ 32-അക്ഷരത്തിലാകും (ഹൈഫണുകൾ ഒഴിവാക്കിയപ്പോൾ). എന്നാൽ പ്രമാണീകരണത്തിന്, 36-അക്ഷര ഫോർമാറ്റ് (8-4-4-4-12) സാധാരണയായി ശുപാർശ ചെയ്യപ്പെടുന്നു.
UUID v7 ഉം മറ്റ് ഫോർമാറ്റുകളും തമ്മിലുള്ള വ്യത്യാസം
| ഫോർമാറ്റ് | ഘടന | ആകെ ദൈർഘ്യം | സമയ-ക്രമീകരണം | ഊഹിക്കാനാവാത്തത് |
|---|---|---|---|---|
| UUID v4 | 122 ബിറ്റ് റാൻഡം + 6 ബിറ്റ് വേരിയന്റ്/വേർഷൻ | 36 അക്ഷരം | ഇല്ല | ഉയർന്നത് |
| UUID v7 | 48-ബിറ്റ് ടൈംസ്റ്റാമ്പ് + 74 ബിറ്റ് റാൻഡം + 6 ബിറ്റ് വേരിയന്റ്/വേർഷൻ | 36 അക്ഷരം | ഉണ്ട് (മില്ലിസെക്കൻഡ്) | ഉയർന്നത് |
| ULID | 48-ബിറ്റ് ടൈംസ്റ്റാമ്പ് + 80 ബിറ്റ് റാൻഡം (Crocker’s base32) | 26 അക്ഷരം | ഉണ്ട് (മില്ലിസെക്കൻഡ്) | ഉയർന്നത് |
| NanoID | വേരിയബിൾ ലെങ്ത് (സാധാരണ 21 അക്ഷരം) | 21+ അക്ഷരം | ഇല്ല | ഉയർന്നത് |
UUID v7-ന്റെ പ്രധാന നേട്ടം, അത് RFC 9562 സ്റ്റാൻഡേർഡ് പിന്തുടരുന്നു എന്നതാണ്. ULID-യുമായി താരതമ്യപ്പെടുത്തുമ്പോൾ, UUID v7-ന് 26-അക്ഷര സ്ട്രിംഗിന് പകരം 36-അക്ഷര സ്ട്രിംഗ് ആണ്. ഇത് കുറച്ച് സ്റ്റോറേജ് എടുക്കുമെങ്കിലും, UUID v7 പല പ്ലാറ്റ്ഫോമുകളിലും നേറ്റീവ് ആയി പിന്തുണയ്ക്കുന്നു (PostgreSQL-ലെ uuid വിഭാഗം പോലെ). UUID v4-ൽ നിന്ന് v7-ലേക്ക് മാറുന്നത് ഡാറ്റാബേസ് ഇൻഡെക്സുകളിൽ ഗണ്യമായ പെർഫോമൻസ് മെച്ചപ്പെടുത്തൽ കൊണ്ടുവരും, പ്രത്യേകിച്ച് ഒരു പ്രാഥമിക കീ ആയി ഉപയോഗിക്കുമ്പോൾ. എന്നാൽ, UUID v7-ന് ULID-യെപ്പോലെ മോണോടോണിക് ഓർഡറിംഗ് ഇല്ല (ULID-യിൽ പോലും അത് കർശനമല്ല, ഒരേ മില്ലിസെക്കൻഡിൽ ജനറേറ്റ് ചെയ്താൽ). NanoID-യുമായി താരതമ്യപ്പെടുത്തുമ്പോൾ, UUID v7-ന് കൂടുതൽ ഘടനാപരമായ ഒരു ഫോർമാറ്റ് ഉണ്ട്, എന്നാൽ NanoID-യ്ക്ക് ചെറിയ ദൈർഘ്യവും ഫ്ലെക്സിബിലിറ്റിയും ഉണ്ട്.
സമയം അടിസ്ഥാനമാക്കിയുള്ള ക്രമീകരണത്തിന്റെ പ്രാധാന്യം
ഡാറ്റാബേസ് ഇൻഡെക്സുകൾ, പ്രത്യേകിച്ച് B-ട്രീകൾ, ഇൻസേർട്ട് ചെയ്ത ഡാറ്റ അവയുടെ കീ അനുസരിച്ച് ക്രമത്തിൽ ഉള്ളപ്പോൾ ഏറ്റവും കാര്യക്ഷമമായി പ്രവർത്തിക്കുന്നു. UUID v4 പോലുള്ള പൂർണ്ണമായും റാൻഡം കീകൾ ഉപയോഗിക്കുമ്പോൾ, പുതിയ റെക്കോർഡുകൾ ഇൻഡെക്സിൽ എവിടെയും ചേർക്കാം, ഇത് ഇൻഡെക്സ് പേജുകളുടെ പതിവ് സ്പ്ലിറ്റിംഗിനും റിബാലൻസിംഗിനും കാരണമാകുന്നു. ഇത് ഡിസ്ക് I/O വർദ്ധിപ്പിക്കുകയും ഇൻസേർട്ട് പെർഫോമൻസ് കുറയ്ക്കുകയും ചെയ്യുന്നു. UUID v7 ഈ പ്രശ്നം പരിഹരിക്കുന്നു, കാരണം അതിന്റെ ആദ്യ ഭാഗം ടൈംസ്റ്റാമ്പ് ആയിരിക്കുന്നതിനാൽ, പുതിയ ID-കൾ ഇൻഡെക്സിന്റെ വലതുവശത്തേക്ക് (ഏറ്റവും പുതിയ സമയം) ചേർക്കപ്പെടും. ഇത് B-ട്രീയുടെ വലതുഭാഗത്തുള്ള ഹോട്ട് സ്പോട്ട് സൃഷ്ടിക്കുന്നു, എന്നാൽ ഇത് UUID v4-ന്റെ ഫ്രാഗ്മെന്റേഷനെക്കാൾ വളരെ മികച്ചതാണ്. വിതരണം ചെയ്ത സിസ്റ്റങ്ങളിൽ, സമയ-ക്രമീകരിച്ച ID-കൾ ഇവന്റ് സോഴ്സിംഗ്, ഓഡിറ്റ് ട്രെയിലുകൾ, മെസേജിംഗ് സിസ്റ്റങ്ങൾ എന്നിവയിൽ സഹായകരമാണ് — ഇവിടെ സംഭവങ്ങളുടെ ക്രമം പ്രധാനമാണ്. ഒരേ മില്ലിസെക്കൻഡിൽ ഒന്നിലധികം ID-കൾ ജനറേറ്റ് ചെയ്യുമ്പോൾ, ടൈംസ്റ്റാമ്പ് ഒന്നുതന്നെയായതിനാൽ, അവയുടെ ക്രമം റാൻഡം ആയിരിക്കും. ഇത് പാരലലിസത്തെ പ്രോത്സാഹിപ്പിക്കുന്നു — ഒരു നോഡ് മറ്റൊന്നിനെ കാത്തിരിക്കേണ്ടതില്ല. എന്നാൽ, നിങ്ങൾക്ക് മില്ലിസെക്കൻഡിനുള്ളിൽ കർശനമായ ക്രമം വേണമെങ്കിൽ, മറ്റ് രീതികൾ (മോണോടോണിക് കൗണ്ടർ അടിസ്ഥാനമാക്കിയുള്ള ID-കൾ പോലെ) പരിഗണിക്കേണ്ടതുണ്ട്.
ബ്രൗസറിൽ ലോക്കലായി ജനറേഷൻ: സ്വകാര്യതയും സുരക്ഷയും
ഈ ടൂൾ ഉപയോഗിക്കുമ്പോൾ, ഒരു വിവരവും സെർവറിലേക്ക് അയക്കുന്നില്ല. ജനറേഷൻ പൂർണ്ണമായും ബ്രൗസറിൽ, ജാവാസ്ക്രിപ്റ്റ് ഉപയോഗിച്ചാണ് നടത്തുന്നത്. ഇതിനർത്ഥം നിങ്ങളുടെ ID-കൾ ഉത്പാദിപ്പിക്കുമ്പോൾ, ആ വിവരങ്ങൾ മൂന്നാം കക്ഷിയുമായി പങ്കിടുന്നില്ല. ശക്തമായ റാൻഡംനെസ്സിനായി, ബ്രൗസറിലെ crypto.getRandomValues() API ഉപയോഗിക്കുന്നു. ഇത് ഒരു സുരക്ഷിത റാൻഡം നമ്പർ ജനറേറ്ററാണ്, സ്ഥിതിവിവരക്കണക്കനുസരിച്ച് ഊഹിക്കാൻ ഏറെ ബുദ്ധിമുട്ടാണ്. കൂടാതെ, ലോക്കൽ ജനറേഷൻ ആയതിനാൽ, നെറ്റ്വർക്ക് ലേറ്റൻസി ഇല്ല — നിങ്ങൾക്ക് ഉടനടി ID-കൾ ലഭിക്കും. ഇത് ഒരു API കോൾ ചെയ്യുന്നതിനേക്കാൾ വേഗമേറിയതും വിശ്വസനീയവുമാണ്. ഓഫ്ലൈൻ പരിതസ്ഥിതികളിലും ഇത് പ്രവർത്തിക്കുന്നു.
സാധാരണ തെറ്റുകളും വ്യക്തതകളും
- ഹൈഫണുകളില്ലാത്ത UUID v7: ഇത് 32-അക്ഷരമാണ്, എന്നാൽ RFC 9562 പ്രകാരം ഔദ്യോഗിക ഫോർമാറ്റ് 36-അക്ഷരമാണ് (8-4-4-4-12). ഹൈഫണുകൾ ഇല്ലെങ്കിൽ, പാർസിംഗ് ബുദ്ധിമുട്ടായിരിക്കും. മിക്ക ഡാറ്റാബേസുകളും 36-അക്ഷര ഫോർമാറ്റ് മാത്രമേ സ്വീകരിക്കുകയുള്ളൂ (PostgreSQL-ലെ uuid വിഭാഗം പോലെ). അതിനാൽ, "Include hyphens" ഓണാക്കാൻ ശുപാർശ ചെയ്യുന്നു.
- വലിയ അക്ഷരങ്ങൾ (uppercase): UUID v7 കേസ്-സെൻസിറ്റീവ് അല്ല —
abcdefഎന്നതുംABCDEFഎന്നതും ഒരുപോലെയാണ്. എന്നാൽ ചില സിസ്റ്റങ്ങളിൽ (ഫയൽ സിസ്റ്റമുകൾ, ഡാറ്റാബേസ് കമ്പാരിസണുകൾ) കേസ് പ്രശ്നമുണ്ടാക്കാം. ഒരു ഒറ്റ ഫോർമാറ്റിൽ ഉറച്ചുനിൽക്കുക. - ഒരേ മില്ലിസെക്കൻഡിൽ ID-കളുടെ ക്രമം: UUID v7-ന് ഒരേ മില്ലിസെക്കൻഡിൽ 2-ഉം 3-ഉം ID-കൾ ജനറേറ്റ് ചെയ്താൽ, അവയുടെ ക്രമം റാൻഡം ആയിരിക്കും. ഇത് ഒരു സവിശേഷതയാണ്, പിഴവല്ല. നിങ്ങൾക്ക് മില്ലിസെക്കൻഡിനുള്ളിൽ ക്രമം ആവശ്യമുണ്ടെങ്കിൽ, ഒരു മോണോടോണിക് കൗണ്ടർ ചേർക്കുന്ന രീതികൾ നോക്കുക (ULID-യുടെ ചില ഇംപ്ലിമെന്റേഷനുകൾ അങ്ങനെ ചെയ്യുന്നുണ്ട്, എന്നാൽ അവയും പൂർണ്ണമായും കർശനമല്ല).
- എത്ര ID-കൾ ജനറേറ്റ് ചെയ്യാം: ഈ ടൂൾ 1 മുതൽ 100 വരെ മാത്രമേ ഒരു സമയം ജനറേറ്റ് ചെയ്യൂ. കൂടുതൽ വേണമെങ്കിൽ, ഒന്നിലധികം തവണ ജനറേറ്റ് ചെയ്യുക, അല്ലെങ്കിൽ ഒരു സ്ക്രിപ്റ്റ് ഉപയോഗിക്കുക.
- കൊളീഷൻ സാധ്യത: UUID v7-ന് 74 ബിറ്റ് റാൻഡം ഭാഗമുണ്ട്, അതിനാൽ കൊളീഷന്റെ സാധ്യത വളരെ കുറവാണ്. ഒരു മില്ലിസെക്കൻഡിൽ 2^74 ID-കൾ ജനറേറ്റ് ചെയ്യുന്നത് അസാധ്യമാണ്. എന്നാൽ, നിങ്ങൾ ഒരേ മില്ലിസെക്കൻഡിൽ ഒന്നിലധികം ID-കൾ ഉണ്ടാക്കുമ്പോൾ, റാൻഡം ബിറ്റുകൾ വ്യത്യസ്തമാണെങ്കിൽ, കൊളീഷൻ സാധ്യത നിസ്സാരമാണ്.
FAQ
UUID v7 ഉം ULID ഉം തമ്മിലുള്ള പ്രധാന വ്യത്യാസം എന്താണ്?
ULID Crocker’s base32 എൻകോഡിംഗ് ഉപയോഗിക്കുന്നു, ഇത് 26-അക്ഷരമാണ്, മൊത്തം 128-ബിറ്റ്. UUID v7 36-അക്ഷര ഹെക്സാഡെസിമൽ ആണ്. ULID-യ്ക്ക് ഒരേ മില്ലിസെക്കൻഡിൽ 1-2-3 എന്ന ക്രമത്തിൽ ജനറേറ്റ് ചെയ്യുന്നവയ്ക്ക് ഒരു മോണോടോണിക് ഓർഡർ ലഭിക്കാനുള്ള സാധ്യതയുണ്ട് (ചില ഇംപ്ലിമെന്റേഷനുകൾ ഒരു കൗണ്ടർ ചേർക്കുന്നു), എന്നാൽ ഇത് സ്റ്റാൻഡേർഡല്ല. UUID v7-ന് അത്തരം ഒരു കൗണ്ടറില്ല, അതിനാൽ ഒരേ മില്ലിസെക്കൻഡിൽ അതിന്റെ ക്രമം പൂർണ്ണമായും റാൻഡം ആണ്.
UUID v7-നെ ഒരു പ്രാഥമിക കീ ആയി ഉപയോഗിക്കാമോ?
തീർച്ചയായും. പല ഡാറ്റാബേസുകളും, PostgreSQL, MySQL 8.0+, SQL Server 2019+ എന്നിവയുൾപ്പെടെ, UUID കോളങ്ങളെ നേറ്റീവ് ആയി പിന്തുണയ്ക്കുന്നു. UUID v7-ന്റെ സമയ-ക്രമീകരണം B-ട്രീ ഇൻഡെക്സുകളിൽ നല്ല പെർഫോമൻസ് നൽകുന്നു. എന്നാൽ, ഇൻഡെക്സ് ഹോട്ട് സ്പോട്ട് (വലതുഭാഗത്തെ അമിത ഉപയോഗം) ഒഴിവാക്കാൻ, നിങ്ങൾ ഇൻഡെക്സ് പേജുകൾ ശരിയായി ട്യൂൺ ചെയ്യേണ്ടതുണ്ട്.
ഒരേ മില്ലിസെക്കൻഡിൽ ജനറേറ്റ് ചെയ്ത ID-കളുടെ ക്രമം എങ്ങനെ നിർണ്ണയിക്കപ്പെടുന്നു?
അവയുടെ റാൻഡം ബിറ്റുകളെ അടിസ്ഥാനമാക്കിയാണ്. ടൈംസ്റ്റാമ്പ് ഒന്നുതന്നെയായതിനാൽ, രണ്ടാം ഭാഗത്തിലെ റാൻഡം ബിറ്റുകൾ ക്രമം നിർണ്ണയിക്കുന്നു. ഇത് കാരണം, ഒരേ മില്ലിസെക്കൻഡിൽ 2 ID-കൾ ഉണ്ടാക്കിയാൽ, ആദ്യത്തേത് രണ്ടാമത്തേതിന് മുമ്പുള്ളതായിരിക്കില്ല — ഇത് ഒരു ട്രേഡ്-ഓഫ് ആണ്.
എന്തുകൊണ്ട് ഈ ടൂൾ 100-ൽ കൂടുതൽ ID-കൾ ഒരു സമയം ജനറേറ്റ് ചെയ്യുന്നില്ല?
ഇത് ഒരു ഉപയോക്തൃ ഇന്റർഫേസ് പരിമിതിയാണ്. 100 ID-കൾ സാധാരണ ആവശ്യങ്ങൾക്ക് മതിയാകും. കൂടുതൽ വേണമെങ്കിൽ, ഒന്നിൽ കൂടുതൽ തവണ ജനറേറ്റ് ചെയ്യുക, അല്ലെങ്കിൽ ഒരു API / ലൈബ്രറി ഉപയോഗിക്കുക.
UUID v7-ന് UUID v4-നേക്കാൾ കുറഞ്ഞ റാൻഡംനെസ് ഉണ്ടോ?
അല്ല. UUID v7-ന് 74 ബിറ്റ് റാൻഡം ബിറ്റുകൾ ഉണ്ട് (122 ൽ കുറവാണ്, പക്ഷേ പ്രായോഗികമായി ഇത് മതി). 2^74 എന്നത് വളരെ വലിയ സംഖ്യയാണ്, അതിനാൽ കൊളീഷൻ സാധ്യത നിസ്സാരമാണ്. കൂടാതെ, 48-ബിറ്റ് ടൈംസ്റ്റാമ്പ് കൂടുതൽ അൺഗസബിലിറ്റി ചേർക്കുന്നില്ല, എന്നാൽ ഇത് ID-കളെ സമയം അനുസരിച്ച് ക്രമീകരിക്കാൻ സഹായിക്കുന്നു.