ULID генератор: Цагийн дарааллаар эрэмблэгддэг, товч тодорхойлогч үүсгэх хэрэгсэл
ULID генератор хуудас нь танд товч, цагийн дарааллаар эрэмблэгддэг, URL-аюулгүй 128 битийн тодорхойлогчдыг хурдан шуурхай үүсгэх боломжийг олгодог. Энэ хэрэгсэл нь бусад форматаас (жишээ нь UUID v4, UUID v7, NanoID) хоёр гол ялгааг санал болгодог: ULID нь ердөө 26 тэмдэгтээс бүрддэг (UUID-ийн 36 тэмдэгтийн оронд) бөгөөд зөвхөн Crockford-ийн base32 цагаан толгойг ашигладаг. Ингэснээр тодорхойлогч нь том жижиг үсгийг ялгалгүй, зураасгүй, URL-д ямар нэгэн тусгай тэмдэгт ашиглахгүйгээр шууд ажилладаг. Хамгийн чухал нь: ULID-ийн эхний 10 тэмдэгт нь миллисекундын нарийвчлалтай цагийн тамгыг кодолдог тул тодорхойлогчдыг үүсгэх цаг хугацаагаар нь лексикографийн дарааллаар эрэмбэлэх боломжтой болдог.
Энэ хуудасны тохиргоо нь маш энгийн: ULID форматыг сонгоод, 1-ээс 100 хүртэлх тооны тодорхойлогч хэдэн ширхэг хэрэгтэйг зааж өгөхөд л хангалттай. Дараа нь хэрэгсэл шууд жагсаалтыг гаргаж өгнө. Та тус бүр дээр дарж хуулах эсвэл "Бүгдийг хуулах" товчийг ашиглан бүх жагсаалтыг нэг дор хуулж болно. "Бэлэн", "Үүсгэгдсэн", "Бүгдийг хуулав" гэсэн статусын мэдээллүүд нь үйлдлийг баталгаажуулдаг.
Бусад форматаас ялгаатай нь ULID хуудсанд том үсэг/жижиг үсэг эсвэл зураас оруулах/авах товчлуур байхгүй. Учир нь ULID нь үндсэндээ том жижиг үсгийг ялгалгүй, зураасгүй байхаар тодорхойлогддог. Тиймээс ямар ч нэмэлт тохиргоо шаардлагагүй.
ULID-ийн дотоод бүтэц ба кодчилол
ULID нь 128 бит мэдээллийг дараах хоёр хэсэгт хуваадаг:
- 48 бит (эхний 10 тэмдэгт): Миллисекундын нарийвчлалтай UNIX цагийн тамга. Энэ нь тодорхойлогчийг үүсгэсэн цаг хугацааг бүртгэж, лексикографийн эрэмбэлэлтийг боломжтой болгодог.
- 80 бит (сүүлийн 16 тэмдэгт): Санамсаргүй хэсэг. Энэ нь
crypto.getRandomValues()ашиглан хөтөч дотор үүсгэгддэг.
Эдгээр 128 битийг Crockford-ийн base32 кодчилол ашиглан 26 тэмдэгтээр илэрхийлдэг. Crockford-ийн base32 цагаан толгой нь 0-9 тоо болон A-Z үсгүүдээс (I, L, O, U үсгийг хасч) бүрддэг. Ингэснээр төөрөгдөл үүсгэдэг тэмдэгтүүдийг арилгаж, тодорхойлогчдыг том жижиг үсгийг ялгалгүй унших, бичих боломжийг олгодог. Жишээлбэл, 01BX5ZZ0K6Z8K4Z8K4Z8K4Z8K4 гэх мэт харагдах болно.
Ажиллах жишээ: Хэрэв та 2025 оны 3-р сарын 20-ны 10:30:00.123 цагт ULID үүсгэвэл эхний 10 тэмдэгт нь тухайн миллисекундыг кодолсон цагийн тамга байх бөгөөд сүүлийн 16 тэмдэгт нь санамсаргүй утгууд байх болно. Дараагийн миллисекундэд үүсгэсэн ULID нь эхний тэмдэгтүүдээрээ арай том утгатай байх тул хоёр ULID-ийг лексикографийн дарааллаар эрэмбэлэхэд эхнийх нь өмнө жагсана.
UUID-тай харьцуулалт: ULID юугаараа давуу вэ?
Олон хөгжүүлэгчдэд танил болсон UUID v4 (36 тэмдэгт, 128 бит) эсвэл шинэ UUID v7 (мөн 36 тэмдэгт, гэхдээ цагийн тамгатай) байдаг. Гэхдээ ULID нь хэд хэдэн чухал ялгааг санал болгодог:
| Онцлог | ULID | UUID v4 / UUID v7 |
|---|---|---|
| Урт | 26 тэмдэгт | 36 тэмдэгт (4 зураас орсон) |
| Зураас/онцгой тэмдэгт | Байхгүй | 4 зураас, URL-д тусгай эмчилгээ шаарддаггүй ч заримдаг |
| Том жижиг үсэг | Ялгалдаггүй (case-insensitive) | UUID v4: ялгадаг; UUID v7: мөн ялгадаг |
| Цагийн дараалал | Тийм (лексикографийн эрэмбэлэлт) | UUID v4: огт эрэмблэгдэхгүй; UUID v7: цагийн тамгатай ч урт хэвээр |
| URL-аюулгүй байдал | Тийм (бүх тэмдэгт нь RFC 3986-д 'unreserved' гэж тодорхойлогддог) | UUID-ийн 'аа' ба '00' хооронд ялгаа; зураас нь резерв байж болно |
| Кодчилол | Crockford base32 (32 тэмдэгтийн цагаан толгой) | Hexadecimal (16 тэмдэгтийн цагаан толгой) |
URL-аюулгүй байдал: ULID-ийн бүх тэмдэгтүүд (0-9, A-Z-I-L-O-U) нь RFC 3986 стандартын 'unreserved' тэмдэгтүүдийн жагсаалтад багтдаг. Энэ нь URL-д тодорхойлогчийг оруулахад ямар ч хувь кодчилол (percent-encoding) шаардлагагүй гэсэн үг.
Эрэмблэгдэх чадвар: ULID нь цагийн дарааллаар эрэмблэгддэг. UUID v4 нь бүрэн санамсаргүй тул өгөгдлийн сангийн B-модны индексүүдэд оруулах үед хуудас хуваагдсанаас үүдэлтэй гүйцэтгэлийн алдагдал гардаг. UUID v7 нь цагийн тамгатай боловч хэвээр 36 тэмдэгт хэвээр байна. ULID нь 26 тэмдэгтээр ижил 128 бит мэдээллийг илэрхийлж, орон зайг хэмнэж, нэгэн зэрэг цагийн дарааллыг хангадаг.
Том жижиг үсгийн ялгалгүй байдал: Crockford-ийн base32 нь I, L, O, U үсгүүдийг хасаж, 0 ба O, 1 ба I, L, 8 ба B зэрэг төстэй тэмдэгтүүдийг нэгтгэдэг. Тиймээс хэрэглэгчид "q" (жижиг) ба "Q" (том) гэх ялгааг анзаарч, зөв бичих гэж санаа зовохгүйгээр тодорхойлогчийг хуулж ашиглах боломжтой.
Хэрэглэгчийн тохиргоо ба гаралт: хэдэн тодорхойлогч хэрэгтэй вэ?
Хуудасны хяналтын хэсэг дараах хоёр оролтыг хүлээн авдаг:
- Форматын сонголт: ULID гэж сонгосон байх ёстой. Бусад формат руу шилжихэд тэр даруй тодорхойлогчдыг шинээр үүсгэнэ.
- Тоо: Бүхэл тоо, 1-ээс 100 хүртэлх хооронд. Хэрэв 100-аас дээш эсвэл 1-ээс доош тоо оруулбал хэрэгсэл хүлээн авахгүй.
Гаралт нь дараах зүйлсээс бүрддэг:
- Сонгосон тооны ULID-ийн жагсаалт (тодорхойлогч бүр 26 тэмдэгт).
- Үүсгэсэн тодорхойлогчдын тоог харуулсан тоолуур.
- Статусын мэдээ: "Бэлэн." (анхны байдал), "Үүсгэгдсэн." (шинэ жагсаалт үүсгэх үед), "Бүгдийг хуулав!" (бүх жагсаалтыг санах ойд хуулахад).
Тус бүр дээр дарахад тухайн ULID-ийг санах ойд хуулдаг. "Бүгдийг хуулах" товч нь бүх жагсаалтыг нэг хавсаргасан текст болгон хуулдаг.
Тохиргоог өөрчлөх бүрт (формат, тоо, бусад) жагсаалт шинэчлэгддэг. Энэ нь хэрэглэгч хэзээ ч хуучин тодорхойлогчдыг санамсаргүйгээр ашиглахгүй байхыг хангадаг.
Хязгаарын нөхцөл ба аюулгүй байдал: Browser дотор үүсгэх
Хэдийгээр ULID нь цагийн дарааллаар эрэмблэгддэг ч хэд хэдэн чухал хязгаар бий:
-
Нэг миллисекунд доторх эрэмбэлэлт: Хэрэв хоёр ULID ижил миллисекундэд үүсгэгдвэл тэдгээрийн цагийн тамга ижил байх тул лексикографийн дарааллаар эрэмбэлэхэд зөвхөн санамсаргүй хэсэгт тулгуурлан эрэмбэлэгдэнэ. Энэ нь нэг миллисекунд дотор үүсгэсэн тодорхойлогчдын хооронд хатуу дэс дараалал баталгаажуулдаггүй гэсэн үг. Гэхдээ өөр өөр цагт үүсгэсэн тодорхойлогчдыг үргэлж зөв эрэмбэлж болно.
-
Мөргөлдөөний магадлал: ULID-ийн санамсаргүй хэсэг нь 80 бит (2^80 боломжит санамсаргүй утгууд). Энэ нь маш том орон зайг бүрдүүлдаг. Жишээлбэл, секундэд 1 сая ULID үүсгэдэг бол (ижил цагийн тамгад багтах) мөргөлдөөний магадлал 2^80-ийн 1 хэмжээтэй байх бөгөөд энэ нь бараг тэгтэй тэнцэнэ. Ихэнх бодит хэрэглээнд энэ магадлал тооцохгүй байж болно.
-
Бүх тодорхойлогчийг хөтөч дотор үүсгэх: Хэрэгсэл нь
crypto.getRandomValues()ашиглан санамсаргүй утгуудыг үүсгэдэг бөгөөд тооцоолол бүгд таны хөтөч дотор явагддаг. Ямар ч өгөгдөл серверт дамждаггүй. Энэ нь таны тодорхойлогчдын нууцлалыг хангаж, сүлжээний урсгалыг бууруулдаг. -
Хязгаарлагдмал тоо: Нэг удаад 1-100 хүртэлх тодорхойлогч үүсгэх боломжтой. Хэрэв 100-аас дээш хэрэгтэй бол та хэд хэдэн удаа дараалан үүсгэх хэрэгтэй.
Хэн ULID ашиглах ёстой вэ? Зорилтот хэрэглэгчид
ULID нь тодорхой тохиолдлуудад тохиромжтой:
-
Вэб болон гар утасны хөгжүүлэгчид: Товч, URL-аюулгүй, цагийн дарааллаар эрэмблэгддэг тодорхойлогч хэрэгтэй бол. Жишээлбэл, REST API-д хэрэглэгчийн ID эсвэл захиалгын ID-г дамжуулах. ULID нь UUID-аас 10 тэмдэгтээр богино тул URL-д оруулахад илүү тохиромжтой.
-
Өгөгдлийн сангийн администраторууд: B-модны индексүүдэд оруулалтыг сайжруулахын тулд монотон нэмэгддэг тодорхойлогч хэрэгтэй бол. Санамсаргүй UUID v4 нь индексийг олон удаа шинэчлэхэд хүргэдэг бол ULID нь шинэ өгөгдлийг ойролцоогоор цаг хугацааны дарааллаар оруулдаг.
-
Тархсан системийн архитекторууд: Олон зангилаанд тодорхойлогчдыг өвөрмөц, нэгэн зэрэг цагийн дарааллаар эрэмблэх шаардлагатай бол. ULID-ийн 128 битийн хэмжээ нь олон тэрбум тодорхойлогчдын дараа ч мөргөлдөхөөс сэргийлдэг.
-
API дизайнерууд: Нийтийн тодорхойлогчийг хүмүүст ээлтэй, таах боломжгүй, гэхдээ хүснэгтэд харагдахад хялбар байлгахыг хүсвэл. Жижиг үсэг/том үсэгний ялгалгүй, зураасгүй ULID нь утасны дугаар эсвэл имэйлээр бичихэд илүү тохиромжтой.
-
Хэрэглэгчийн өгөгдлийг нууцлах шаардлагатай хүмүүс: Хэрэглэгчийн ID-г үүсгэхдээ санамсаргүй байдлыг хадгалахын зэрэгцээ хугацааны дарааллыг хангахыг хүсвэл.
Түгээмэл асуултууд (FAQ)
1. ULID-ийн цагийн тамга ямар нарийвчлалтай вэ? Миллисекундын нарийвчлалтай. 48 битийн цагийн талбар нь 2^48 миллисекунд буюу ойролцоогоор 8,925 жилийг кодлож чаддаг. Энэ нь ихэнх хэрэглээнд хангалттай.
2. Хэрэв нэг миллисекундэд хоёр ULID үүсгэвэл тэдгээрийн дараалал ямар байх вэ? Цагийн тамга ижил тул зөвхөн санамсаргүй хэсэг тэдгээрийг ялгах болно. Ижил миллисекундэд үүсгэсэн ULID-ийн хооронд хатуу дэс дараалал баталгаажуулдаггүй. Хэрэв танд ийм баталгаа хэрэгтэй бол нэмэлт дэс дараалал нэмэх хэрэгтэй.
3. ULID-ийг өгөгдлийн сангийн үндсэн түлхүүр болгон ашиглахад ямар давуу талтай вэ? ULID нь лексикографийн дарааллаар эрэмблэгддэг тул B-модны индекст оруулахад хуудас хуваагдах нь багасдаг. Энэ нь санамсаргүй UUID v4-тэй харьцуулахад оруулалтын гүйцэтгэлийг сайжруулдаг.
4. ULID-ийн мөргөлдөөний магадлал хэд вэ? 80 битийн санамсаргүй хэсэгтэй тул мөргөлдөөний магадлал маш бага. Тодорхойлолтоор: 2^80 боломжит санамсаргүй утгуудын хооронд мөргөлдөх магадлал нь генерацийн тооноос хамаарна. Жишээлбэл, 1 тэрбум ULID үүсгэсэн ч мөргөлдөх магадлал 2^80-ийн 10^9 хэмжээтэй, энэ нь бараг тэг юм.
5. Би ULID-ийг том үсгээр харахыг хүсвэл яах вэ? Том жижиг үсэг ялгалгүй гэдэг нь юу гэсэн үг вэ?
Том жижиг үсэг ялгалгүй гэдэг нь 01BX5ZZ0K болон 01bx5zz0k хоёулаа ижил ULID гэж үзэгдэнэ гэсэн үг. Та аль ч хэлбэрээр бичиж болно. Хэрэгсэл нь тодорхойлогчийг ихэвчлэн дээд тэмдэгтээр харуулдаг ч доогуур тэмдэгт оруулахад үүнийг хүлээн авна.
6. ULID нь UUID-эсвэл NanoID-ийн оронд ашиглах боломжтой юу? Тийм, гэхдээ хэрэглээний шаардлагаас хамаарна. Хэрэв танд 128 битийн тодорхойлогч хэрэгтэй, цагийн дараалал чухал, 26 тэмдэгтийн урт хангалттай бол ULID нь маш сайн сонголт. NanoID нь уртыг тохируулах боломжийг санал болгодог (жишээ нь 21 тэмдэгт) боловч 128 битээс бага санамсаргүй талбартай. ULID нь 128 битийг хадгалдаг.
Эцэст хэлэхэд, ULID генератор нь товч, цагийн дарааллаар эрэмблэгддэг, URL-аюулгүй, хүний алдааг багасгадаг тодорхойлогчдыг хурдан бөгөөд нууцлалаар үүсгэхэд зориулагдсан хэрэгсэл юм. Хэрэв танд өгөгдлийн сангийн индекс, API тодорхойлогч эсвэл тархсан системд зориулсан өвөрмөц ID хэрэгтэй бол ULID нь UUID болон бусад форматын энгийн, үр дүнтэй хувилбар юм. Бүх тооцоо хөтөч дотор хийгддэг тул таны өгөгдөл хэзээ ч серверт очихгүй.