ይህ የ ULID ማመንጫ ገጽ ከሌሎች የሚለይበት ምክንያት
ይህ የ ULID (Universally Unique Lexicographically Sortable Identifier) ማመንጫ መሳሪያ ከተለመዱት የ UUID ማመንጫዎች በብዙ ዋና ዋና ባህሪያቱ ይለያል። ዋነኛው ልዩነት የቁምፊዎች ርዝመት እና አወቃቀር ላይ ነው። የ UUID መለያዎች ባለ 36 ቁምፊዎች (characters) ሲሆኑ፣ ULID ግን በ 26 ቁምፊዎች ብቻ የተገነባ አጭር መለያ ነው። ይህ አጭርነቱ በዳታቤዝ ውስጥ የሚይዘውን የማከማቻ ቦታ ከመቀነሱም በላይ መለያዎቹን ለማንበብ እና ለመገልበጥ ቀላል ያደርጋቸዋል።
ሌላው ይህንን ገጽ ለየት የሚያደርገው የክሮክፎርድ ቤዝ32 (Crockford’s Base32) የአጻጻፍ ስልትን መጠቀሙ ነው። በዚህ ምክንያት መለያዎቹ ሙሉ በሙሉ ከሃይፈን (hyphen -) የጸዱ እና በትልልቅ ወይም በትንንሽ ፊደላት መጻፋቸው ልዩነት የማያመጣባቸው (case-insensitive) ናቸው። በዚህ ገጽ ላይ የፊደላት ማስተካከያ (uppercase) ወይም የሃይፈን መቀያየሪያ ቁልፎች የማይታዩት ለዚሁ ነው። ምክንያቱም ULID በተፈጥሮው ሃይፈን ስለሌለው እና የፊደላት መጠን ልዩነት ስለማይፈጥርባቸው እነዚህ አማራጮች አያስፈልጉትም።
በተጨማሪም እያንዳንዱ መለያ በጊዜ ቅደም ተከተል ሊደረደር የሚችል (lexicographically sortable) ነው። ምክንያቱም የመጀመሪያዎቹ 10 ቁምፊዎች የተሰሩት በሚሊሰከንድ ትክክለኛነት ባለው የታይምስታምፕ (millisecond-precision timestamp) መረጃ ላይ በመመስረት ነው። የተቀሩት 16 ቁምፊዎች ደግሞ የዘፈቀደነትን (randomness) ለማረጋገጥ የሚያገለግሉ ናቸው። ይህ መሳሪያ ያለ ምንም ተጨማሪ የደህንነት ስጋት መለያዎችን ሙሉ በሙሉ በአካባቢው ብሮውዘር (local browser) ውስጥ ብቻ ያመነጫል።
የ ULID ውስጣዊ አወቃቀር እና የቢት ክፍፍል
የ ULID መለያዎች ልክ እንደ UUID ሁሉ በጀርባቸው 128 ቢት (bits) መረጃን ይይዛሉ። ነገር ግን ይህንን 128 ቢት መረጃ ወደ ፅሁፍ የሚቀይሩበት እና የሚከፋፍሉበት መንገድ የተለየ ነው። እያንዳንዱ ULID በሁለት ዋና ዋና ክፍሎች የተከፈለ ነው፡-
-
የታይምስታምፕ ክፍል (Timestamp Component - 48 Bits): ይህ ክፍል ለመለያው የመጀመሪያዎቹን 10 ቁምፊዎች ይሰጣል። በውስጡም መለያው የተፈጠረበትን ትክክለኛ ሰዓት በሚሊሰከንድ (millisecond) ትክክለኛነት ይመዘግባል። ይህ የዩኒክስ ዘመን (Unix Epoch) ከጀመረበት ጊዜ አንስቶ ያለውን ጊዜ የሚቆጥር ሲሆን፣ እስከ አቆጣጠር 10889 ዓመተ ምህረት ድረስ ያለ ምንም ችግር መስራት የሚያስችል አቅም አለው። ይህ ታይምስታምፕ መለያዎቹ በተፈጠሩበት ቅደም ተከተል መሰረት በዳታቤዝ ውስጥ በራስ-ሰር እንዲደረደሩ ያስችላቸዋል።
-
የዘፈቀደ ክፍል (Random Component - 80 Bits): የታይምስታምፕ ክፍሉን ተከትሎ የሚመጣው ይህ ክፍል ደግሞ የመጨረሻዎቹን 16 ቁምፊዎች ይሸፍናል። ይህ ክፍል በይዘቱ 80 ቢት የዘፈቀደ መረጃን (entropy) የሚይዝ ሲሆን፣ በተመሳሳይ ሚሊሰከንድ ውስጥ የሚፈጠሩ መለያዎች እርስ በእርስ እንዳይጋጩ እና ፍጹም የተለዩ እንዲሆኑ ዋስትና ይሰጣል።
እነዚህ ሁለት ክፍሎች ተደምረው (48 ቢት + 80 ቢት) ጠቅላላ 128 ቢት መረጃን ይፈጥራሉ። ይህ መረጃ በቤዝ32 (Base32) ሲደሰቅ ወደ 26 ቁምፊዎች አጭር የፅሁፍ መግለጫ ይቀየራል።
የክሮክፎርድ ቤዝ32 (Crockford’s Base32) ኢንኮዲንግ እና ጥቅሞቹ
ULID ለመለያዎቹ ውክልና የሚጠቀመው የክሮክፎርድ ቤዝ32 (Crockford’s Base32) ኢንኮዲንግ አልፋቤትን ነው። ይህ አልፋቤት ቁጥሮችን ከ 0 እስከ 9 እና የእንግሊዘኛ ፊደላትን ያካትታል። ነገር ግን በሰዎች ዘንድ በቀላሉ ሊሳሳቱ የሚችሉ የተወሰኑ ፊደላትን ሆን ብሎ ያስወግዳል።
በዚህ አልፋቤት ውስጥ የማይካተቱት ፊደላት የሚከተሉት ናቸው፡-
- I እና L (ትልቅ እና ትንሽ ፊደላት): እነዚህ ፊደላት ከቁጥር 1 (አንድ) ጋር ሊምታቱ ስለሚችሉ ሙሉ በሙሉ ተወግደዋል።
- O (ኦ): ይህ ፊደል ከቁጥር 0 (ዜሮ) ጋር በሰፊው ስለሚምታታ አልተካተተም።
- U (ዩ): ይህ ፊደል የተወገደው ደግሞ በዘፈቀደ በሚፈጠሩ ቃላት ውስጥ በአጋጣሚ ያልተፈለጉ ወይም ጸያፍ ቃላት (profanity) እንዳይፈጠሩ ለመከላከል ነው።
የክሮክፎርድ ቤዝ32 አልፋቤትን በመጠቀሙ ምክንያት የ ULID መለያዎች የሚከተሉትን ጥቅሞች ያገኛሉ፡-
- ለሰው ልጅ ንባብ ምቹ መሆን (Human-readable): በጽሁፍ ለመለዋወጥ እና ለማንበብ እጅግ በጣም ቀላል እና ለአጠቃቀም ምቹ ናቸው።
- የፊደላት መጠን ግድ የለሽ መሆን (Case-Insensitive): መለያዎቹ በትልልቅ ፊደላትም ይጻፉ በትንንሽ ፊደላት እሴታቸው ተመሳሳይ ነው።
- ለዩአርኤል (URL) ምቹ መሆን: ምንም አይነት ልዩ ቁምፊዎችን ወይም ምልክቶችን ስለማይጠቀም በድረ-ገጽ አድራሻዎች (URLs) ላይ ያለ ምንም ስጋት እና ልዩ ኢንኮዲንግ (percent-encoding) በቀጥታ መጠቀም ይቻላል።
የ ULID እና UUID ንፅፅር (UUID v4 እና UUID v7)
በሶፍትዌር ግንባታ ውስጥ በብዛት ጥቅም ላይ ከሚውሉት የ UUID አይነቶች (በተለይም UUID v4 እና UUID v7) ጋር ሲነጻጸር ULID ግልጽ የሆኑ ጠቀሜታዎች አሉት።
| ባህሪ | ULID | UUID v4 | UUID v7 |
|---|---|---|---|
| የቁምፊዎች ብዛት | 26 ቁምፊዎች | 36 ቁምፊዎች (ከነሃይፈን) | 36 ቁምፊዎች (ከነሃይፈን) |
| መለያያ ምልክት (Hyphen) | የለውም | አለው (4 ሃይፈኖች) | አለው (4 ሃይፈኖች) |
| የጊዜ ቅደም ተከተል ድርደራ | አለው (በታይምስታምፕ) | የለውም (ሙሉ በሙሉ የዘፈቀደ) | አለው (በታይምስታምፕ) |
| የፊደላት መጠን ስሜታዊነት | የለውም (Case-insensitive) | አለው (ብዙውን ጊዜ በትንንሽ ፊደላት) | አለው (ብዙውን ጊዜ በትንንሽ ፊደላት) |
| ባይት መጠን (Storage) | 128 ቢት (በዳታቤዝ ውስጥ 16 ባይት) | 128 ቢት (በዳታቤዝ ውስጥ 16 ባይት) | 128 ቢት (በዳታቤዝ ውስጥ 16 ባይት) |
UUID v4 ሙሉ በሙሉ በዘፈቀደ የሚመነጭ በመሆኑ በጊዜ ቅደም ተከተል ለመደርደር አይመችም። UUID v7 ልክ እንደ ULID የጊዜ ቅደም ተከተል ያለው ቢሆንም አሁንም ቢሆን የ UUID ባህላዊ ፎርማትን (ባለ 36 ቁምፊዎች ከነሃይፈኑ) ይዞ ይቀጥላል። ULID ግን ተመሳሳይ የ 128 ቢት ደህንነትን ይዞ ይበልጥ በተቀናጀ፣ በአጭር እና ለሰው ልጅ ንባብ ምቹ በሆነ መልኩ መረጃዎችን ያቀርባል።
በዳታቤዝ ኢንዴክስ አፈጻጸም እና በB-Tree መዋቅር ላይ ያለው ተፅዕኖ
በዳታቤዝ ውስጥ የዘፈቀደ መለያዎችን (እንደ UUID v4 ያሉ) እንደ ዋና መለያ (Primary Key) መጠቀም የዳታቤዙን አፈጻጸም በከፍተኛ ሁኔታ ሊቀንሰው ይችላል። ለዚህም ምክንያቱ አብዛኛዎቹ የሪሌሽናል ዳታቤዞች (እንደ PostgreSQL፣ MySQL እና SQL Server ያሉ) መረጃዎችን በቢ-ትሪ (B-Tree) መዋቅር አማካኝነት ኢንዴክስ ስለሚያደርጉ ነው።
ሙሉ በሙሉ የዘፈቀደ የሆኑ መለያዎች ወደ ዳታቤዝ በሚገቡበት ጊዜ፡-
- የኢንዴክስ መበታተን (Index Fragmentation): አዲሱ መለያ የት እንደሚቀመጥ አስቀድሞ መተንበይ ስለማይቻል ዳታቤዙ አዳዲስ መረጃዎችን በቅደም ተከተል ማስገባት አይችልም። ይህ ደግሞ በዳታቤዝ ገጾች (index pages) መካከል ክፍተቶችን በመፍጠር መረጃዎችን በየቦታው ይበታትናል።
- የገጽ መከፈል (Page Splits): አዲስ መረጃ በነባር ገጾች መካከል ለመሰንቀቅ በሚሞከርበት ጊዜ ገጾቹ ተከፍለው አዳዲስ ገጾች እንዲፈጠሩ ይገደዳሉ። ይህ ሂደት ከፍተኛ የዲስክ ንባብ እና ፅሁፍ (I/O operations) ስለሚጠይቅ የዳታቤዙን ፍጥነት ያቀንሰዋል።
በተቃራኒው ULID በጊዜ ቅደም ተከተል ሊደረደር የሚችል በመሆኑ አዳዲስ መረጃዎች ሁልጊዜም በኢንዴክስ መዋቅሩ መጨረሻ ላይ በቅደም ተከተል ይቀመጣሉ። ይህ ሁኔታ የገጽ መከፈልን በማስቀረት የዳታቤዝ ፅሁፍ አፈጻጸምን (write throughput) በከፍተኛ ሁኔታ ያሻሽላል። የዳታቤዝ አስተዳዳሪዎች ያለ ምንም ተጨማሪ የጊዜ አምድ (timestamp column) መረጃዎችን በቀላሉ በመለያቸው ብቻ መደርደር ይችላሉ።
በአካባቢው ብሮውዘር (Local Generation) የመነጨበት መንገድ እና ደህንነት
ይህ መሳሪያ የ ULID መለያዎችን ለማመንጨት ምንም አይነት የውጪ ሰርቨር (server) ግንኙነት አይጠቀምም። ሁሉም የማመንጨት ስራዎች የሚከናወኑት በቀጥታ በተጠቃሚው ብሮውዘር ውስጥ ብቻ ነው።
ይህ የአካባቢ አሰራር የሚከተሉትን ጥቅሞች ይሰጣል፡-
- ፍጹም ሚስጥራዊነት: ምንም አይነት የመለያ መረጃ ወይም የአጠቃቀም ታሪክ ወደ የትኛውም የውጪ ሰርቨር አይላክም። መለያዎቹ የሚፈጠሩት በእርስዎ ኮምፒውተር ላይ ብቻ በመሆኑ መረጃዎችዎ ፍጹም ደህንነታቸው የተጠበቀ ነው።
- ከፍተኛ ፍጥነት: የኔትወርክ መዘግየት (network latency) ሳይኖር መለያዎቹን በቅጽበት ማመንጨት ይቻላል።
- ጠንካራ የዘፈቀደነት ምንጭ: መለያዎችን ለማመንጨት ብሮውዘሩ የሚጠቀመው ክሪፕቶግራፊክ ጥንካሬ ያለውን የዘፈቀደ እሴት ማመንጫ (
crypto.getRandomValues()) ነው። ይህ ደግሞ የሚፈጠሩት የዘፈቀደ ቁምፊዎች እጅግ በጣም አስተማማኝ እና ሊገመቱ የማይችሉ መሆናቸውን ያረጋግጣል።
በመሳሪያው ላይ የቁጥር መቆጣጠሪያውን (Count) በመጠቀም በአንድ ጊዜ ከ 1 እስከ 100 የሚደርሱ መለያዎችን ማመንጨት ይችላሉ። የቁጥር ምርጫውን በለወጡ ቁጥር መለያዎቹ በራስ-ሰር አዲስ ዝርዝር ያመነጫሉ። እንዲሁም የተፈጠሩትን መለያዎች በአንድ ጊዜ ለመገልበጥ "Copied all!" የሚለውን አማራጭ ወይም እያንዳንዱን መለያ ለይቶ ለመገልበጥ መለያው ላይ ጠቅ ማድረግ ብቻ በቂ ነው።
በተደጋጋሚ የሚነሱ ጥያቄዎች (FAQ)
ULID ምንድን ነው?
ULID (Universally Unique Lexicographically Sortable Identifier) በጊዜ ቅደም ተከተል ሊደረደሩ የሚችሉ፣ 128 ቢት መጠን ያላቸው እና በ 26 ቁምፊዎች የሚወከሉ ልዩ መለያዎች ናቸው።
ULID በጊዜ ቅደም ተከተል የሚደረደረው እንዴት ነው?
የ ULID የመጀመሪያዎቹ 10 ቁምፊዎች መለያው የተፈጠረበትን ጊዜ በሚሊሰከንድ ትክክለኛነት ይይዛሉ። ይህም መለያዎቹ በተፈጠሩበት ቅደም ተከተል መሰረት በፊደልና በቁጥር (lexicographically) በቀላሉ እንዲደረደሩ ያስችላቸዋል።
በተመሳሳይ ሚሊሰከንድ ውስጥ የተፈጠሩ መለያዎች ከተደራረቡ ምን ይሆናል?
በተመሳሳይ ሚሊሰከንድ ውስጥ ከአንድ በላይ መለያዎች ከተፈጠሩ፣ የ 80 ቢት የዘፈቀደ ክፍሉ መለያዎቹ እርስ በእርስ እንዳይመሳሰሉ እና ልዩ እንዲሆኑ ያደርጋል። ነገር ግን በተመሳሳይ ሚሊሰከንድ ውስጥ ለተፈጠሩት መለያዎች ጥብቅ የሆነ የጊዜ ቅደም ተከተል ዋስትና አይኖርም።
ለምንድነው በዚህ ገጽ ላይ የሃይፈን ወይም የፊደላት መጠን መቀያየሪያ አማራጭ የሌለው?
የ ULID ስታንዳርድ በተፈጥሮው ምንም አይነት ሃይፈን አይጠቀምም። እንዲሁም የክሮክፎርድ ቤዝ32 ኢንኮዲንግ ስለሚጠቀም የፊደላት መጠን ልዩነት (case-insensitive) አያመጣም። ስለዚህ እነዚህን አማራጮች ማካተት አያስፈልግም።
የ ULID መለያዎች በዩአርኤል (URL) ውስጥ ለመጠቀም ደህና ናቸው?
አዎ፣ ፍጹም ደህና ናቸው። ULID የሚጠቀመው የክሮክፎርድ ቤዝ32 ቁምፊዎችን ብቻ በመሆኑ ምንም አይነት ልዩ ምልክቶችን አይይዝም። ስለዚህ በድረ-ገጽ አድራሻዎች ላይ ያለ ምንም ስጋት በቀጥታ ጥቅም ላይ ሊውል ይችላል።