UUID v7 үүсгэгч: Цаг хугацаанд эрэмблэгдсэн, таахын аргагүй ID-уудыг хэрхэн гаргах вэ
UUID v7 нь 48 битийн Unix миллисекундын цагийн тэмдэг дээр суурилсан, дараа нь санамсаргүй битүүдээр дүүргэгдсэн 128 битийн идентификатор юм. Энэхүү хуудас нь 1-ээс 100 хүртэлх тооны UUID v7 ID-г хэрэглэгчийн заасан тохиргоогоор (том үсэг, зураас байгаа эсэх) нэн даруй гаргаж өгдөг. Өөрөөр хэлбэл, та зөвхөн тоо болон харуулах сонголтуудыг оруулахад л 36 тэмдэгтээс бүрдсэн, цаг хугацаагаар эрэмблэгдсэн, таахад хэцүү мөрүүдийн жагсаалтыг хүлээн авна.
Энэхүү хэрэгслийн гол онцлог нь UUID v7 нь 48 битийн Unix миллисекундын цагийн тэмдгийг ID-ийн эхэнд шингээдэг, дараа нь санамсаргүй байдлаар бүрдүүлдэгт оршино. Ингэснээр ID-ууд үүссэн цаг хугацаагаар хронологийн дарааллаар эрэмблэгддэг (UUID v4-ийн индекс-локалтын асуудлыг шийддэг) боловч криптографийн хувьд таахад төвөгтэй хэвээр байна. UUID v4, ULID, NanoID зэрэг бусад форматуудаас ялгаатай нь v7 нь 36 тэмдэгтийн мөр бөгөөд эхний тэмдэгтүүд нь цагийн тэмдэг байдаг; нэг миллисекундын дотор үүссэн ID-уудын хооронд хатуу эрэмбэ хангадаггүй.
Оролтын хэсэгт та дараах зүйлсийг тохируулна:
- Формат: UUID v7 (формат сонгогчоос сонгосон).
- Тоо: 1-ээс 100 хүртэлх тоо.
- Том үсэг: UUID-г том үсгээр харуулах эсэх.
- Зураас оруулах: гаралтад зураас байх эсэх.
Гаралт нь дараахь зүйлсийг агуулна:
- Үүсгэгдсэн UUID v7 идентификаторуудын жагсаалт.
- ID-ийн тоо (тоолуур).
- "Ready." (сул байдал) төлөв.
- "Generated." төлөв үүсгэсний дараа.
- "Copied all!" бүх ID-г санах ойн буферт хуулсан үед.
- Тус тусын ID дээр дарахад тухайн ID хуулагдана.
Дүрэм, хязгаарын тохиолдлууд:
- UUID v7 нь 36 тэмдэгтийн формат бөгөөд 48 битийн Unix миллисекундын цагийн тэмдгээр эхэлдэг.
- Аливаа сонголтыг өөрчлөх (тоо, том үсэг, зураас) нь тэр даруй бүх ID-г шинэчилнэ.
- ID-ууд нь локал хөтөч дээр хүчтэй хөтчийн санамсаргүй байдлыг ашиглан үүсгэгддэг; BroBroGo руу юу ч илгээгддэггүй.
- UUID v7 болон ULID нь цаг хугацаагаар эрэмблэгддэг боловч нэг миллисекундын дотор үүссэн ID-уудын хатуу эрэмбийг хангадаггүй.
- Хэрэгсэл нь нэг удаад 1-ээс 100 хүртэлх ID-г гаргадаг.
Хэн энэ хэрэгслийг ашиглах ёстой вэ? Энэхүү хэрэгсэл нь дараах хүмүүст зориулагдсан:
- Тархсан системд хронологийн дарааллаар эрэмблэгдэх гол түлхүүрүүд хэрэгтэй хөгжүүлэгчид.
- UUID v4-ийн санамсаргүй байршлаас үүдэлтэй индекс хуваагдлаас зайлсхийхийг хүсдэг өгөгдлийн сангийн администраторууд.
- Цаг хугацаанд суурилсан эрэмбэлэлт бүхий таахад төвөгтэй идентификаторууд хэрэгтэй аюулгүй байдлын мэргэжилтнүүд.
- UUID v4-ээс цагийн суурьтай формат руу шилжиж, өгөгдлийн сангийн оруулах гүйцэтгэлийг сайжруулахыг хүсдэг хүмүүс.
Одоо энэ сэдвийг гүнзгийрүүлэн авч үзье. Бид хэд хэдэн H2 гарчигтай хэсгүүдийг багтаах болно.
UUID v7-ийн бүтэц: Цаг хугацаа ба санамсаргүй байдлын нэгдэл
UUID v7 нь RFC 9562 стандартад тодорхойлогдсон, 128 битийн өвөрмөц идентификатор юм. Эхний 48 бит нь Unix форматаар (1970 оны 1-р сарын 1-нээс хойшхи миллисекундын тоо) илэрхийлэгдсэн цагийн тэмдэг байна. Дараагийн 74 бит нь санамсаргүй бит бөгөөд эцсийн 6 бит нь хувилбарын (version) болон хувилбарын дэд төрлийн (variant) талбаруудыг бүрдүүлдэг. Ингэснээр нийт 128 бит нь 36 тэмдэгтийн текст хэлбэрээр илэрхийлэгддэг (32 hex цифр, 4 зураас).
Жишээ нь: 0195e1d0-7d5c-7a3e-b001-23456789abcd. Энд 0195e1d0 нь цагийн тэмдгийн эхний хэсэг, 7d5c нь дараагийн хэсэг, 7 нь хувилбарыг (v7), a3e нь цагийн тэмдгийн үлдсэн хэсэг эсвэл санамсаргүй бит, b001 нь хувилбарын дэд төрөл (variant) ба санамсаргүй бит, сүүлийн 12 hex цифр нь санамсаргүй бит юм. Хувилбарын дэд төрөл нь RFC 9562-д тодорхойлсон стандарт 10xx (binary) байна.
Цагийн тэмдэг нь миллисекундын нарийвчлалтай байдаг тул нэг миллисекундын дотор олон ID үүсгэх боломжтой. Энэ тохиолдолд ID-ууд нь цагийн тэмдгээр ижил боловч санамсаргүй хэсгээрээ ялгаатай байдаг. Тиймээс UUID v7 нь нэг миллисекундын дотор үүссэн ID-уудын хатуу эрэмбийг хангадаггүй. Энэ нь зохион байгуулалтын алдаа биш, харин зориудын загвар юм. Учир нь хатуу эрэмбэ хангахын тулд дарааллын тоолуур эсвэл бусад синхрончлолын механизм шаардагдана, энэ нь параллелизм болон тархсан системд хүндрэл учруулдаг.
Цаг хугацаанд суурилсан эрэмбэлэлт: Яагаад энэ нь өгөгдлийн сангийн индекст чухал вэ?
UUID v4-ийн гол дутагдал нь түүний бүрэн санамсаргүй байдал юм. UUID v4 нь 122 бит санамсаргүй битээс бүрддэг (хувилбар ба хувилбарын дэд төрлийг эс тооцвол). Энэ нь өгөгдлийн сангийн B-модны индекст оруулах үед гүйцэтгэлийг ноцтойгоор бууруулдаг. Учир нь шинэ мөр бүр хаана ч байж болох тул B-модны зангилааг байнга хуваах, дахин тэнцвэржүүлэх шаардлагатай болдог. Энэ нь ялангуяа их хэмжээний өгөгдөл оруулах үед маш их хог хаягдал (overhead) үүсгэдэг.
UUID v7 нь цагийн тэмдгийг эхэнд байрлуулснаар энэ асуудлыг шийддэг. B-мод нь цагийн тэмдгийн дарааллаар оруулалтыг ихэвчлэн баруун тийш (хамгийн сүүлийн хуудас руу) чиглүүлдэг тул хуудас хуваагдах тоо багасдаг. Энэ нь оруулах гүйцэтгэлийг ихээхэн сайжруулдаг. Мөн Query-д хронологийн дарааллаар эрэмбэлэх шаардлага гарвал UUID v7 нь индексээр шууд эрэмбэлэгдэх боломжтой тул нэмэлт эрэмбэлэлтийн үйлдэл шаардлагагүй болдог.
Гэхдээ анхаарах нэг чухал зүйл: UUID v7 нь зөвхөн цагийн тэмдэгт суурилсан тул нэг миллисекундын дотор үүссэн ID-уудын дараалал нь тэдгээрийн санамсаргүй хэсгээс хамаарна. Энэ нь зарим тохиолдолд хэсэгчлэн эрэмбэлэгдээгүй байдалд хүргэж болзошгүй. Жишээлбэл, хэрэв та нэг миллисекундын дотор 10 ID үүсгэвэл тэдгээрийн дараалал нь таны хүссэн хугацааны дарааллаас өөр байж болно. Энэ нь ихэнх хэрэглээнд (өгөгдлийн сангийн оруулалт, аудит тэмдэглэл гэх мэт) тийм ч чухал биш, харин нарийн дараалал шаарддаг системд (жишээ нь, санхүүгийн гүйлгээ) тохиромжгүй байж болно.
UUID v7 vs UUID v4: Харьцуулалт ба алдааны нийтлэг тохиолдлууд
UUID v4 ба v7-ийн гол ялгаа нь санамсаргүй байдал ба цагийн тэмдэг юм. Доорх хүснэгтэд харьцуулалтыг харуулав:
| Шинж чанар | UUID v4 | UUID v7 |
|---|---|---|
| Бит бүтэц | 122 бит санамсаргүй + 6 бит тогтмол | 48 бит цагийн тэмдэг + 74 бит санамсаргүй + 6 бит тогтмол |
| Цаг хугацааны эрэмбэ | Байхгүй | Миллисекундаар эрэмбэлэгддэг (ижил миллисекунд доторх ID-уудын хатуу эрэмбэ байхгүй) |
| Мөргөлдөх магадлал | 2^122-ийн нэг | 2^74-ийн нэг (ижил цагийн тэмдэгтэй үед) |
| Индекс локалт | Муу (санамсаргүй тараалт) | Сайн (цаг хугацааны кластер) |
| Стандарт | RFC 9562 | RFC 9562 |
| Урт | 36 тэмдэгт | 36 тэмдэгт |
UUID v4-ээс v7 рүү шилжихдээ хөгжүүлэгчид ихэвчлэн дараах алдаануудыг гаргадаг:
-
Цаг хугацааны нарийвчлалыг буруу ойлгох: UUID v7 нь миллисекундын нарийвчлалтай бөгөөд бичил секунд (microsecond) эсвэл нано секунд (nanosecond) биш. Зарим хэрэгжүүлэлтүүд илүү өндөр нарийвчлалтай цагийн тэмдэг (жишээ нь, нано секунд) ашиглахыг оролддог, гэхдээ энэ нь стандартад нийцэхгүй бөгөөд урвуу нийцтэй байдалд хүргэдэг.
-
Цагийн буцах (clock rollback)-д хариу үйлдэл үзүүлэхгүй байх: Хэрэв системийн цаг буцах юм бол (жишээ нь, NTP синхрончлолын үед) өмнө нь үүсгэсэн ID-уудтай мөргөлдөх боломжтой. Профессионал хэрэгжүүлэлтүүд цагийн буцалтыг илрүүлж, цагийн тэмдгийг түр хугацаанд зогсоох эсвэл хадгалсан цагийг ашигладаг.
-
Нэг миллисекундын дотор олон ID үүсгэх: UUID v7 нь 74 бит санамсаргүй байдлаар нэг миллисекундын дотор 2^74 хүртэлх ID-г мөргөлдөхгүйгээр үүсгэх боломжтой (онолын хувьд). Гэхдээ зарим хэрэгжүүлэлтүүд санамсаргүй бит үүсгэхэд хангалттай энтропи өгдөггүй, ялангуяа хөтчийн орчинд. Энэ хэрэгсэл нь хүчтэй хөтчийн санамсаргүй байдлыг ашигладаг (crypto.getRandomValues) бөгөөд энэ нь криптографийн хувьд аюулгүй санамсаргүй тоо үүсгэдэг.
Хөтөч доторх үүсгэлт: Нууцлал ба гүйцэтгэл
Энэ хуудсын чухал онцлогуудын нэг нь бүх ID-ууд хэрэглэгчийн хөтөч дотор локал байдлаар үүсгэгддэг. Энэ нь дараах давуу талуудыг өгдөг:
- Нууцлал: Өгөгдөл сервер рүү явахгүй. Хэрэглэгчийн үүсгэсэн ID-ууд нь зөвхөн түүний хөтөч дотор үлдэнэ.
- Хурд: Серверийн хариу хүлээх шаардлагагүй. ID-ууд нэн даруй гарч ирдэг.
- Хүрээлэн буй орчноос хамааралгүй: Хэрэгсэл нь интернетгүйгээр ч ажилладаг (хэрэв хуудсыг өмнө нь ачаалсан бол).
Хөтөч доторх санамсаргүй тоо үүсгэгч нь криптографийн хувьд аюулгүй гэж тооцогддог crypto.getRandomValues() функцийг ашигладаг. Энэ функц нь үйлдлийн системээс энтропи авах боломжтой, харин Math.random() нь криптографид тохиромжгүй, учир нь түүнийг таамаглах боломжтой. UUID v7-ийн санамсаргүй хэсэг нь 74 бит учраас хангалттай хүчтэй энтропи шаарддаг, үүнийг Math.random() хангаж чадахгүй.
Зураас ба том үсэг: Форматлалтын ач холбогдол
UUID v7 нь стандартаар 36 тэмдэгтийн текст хэлбэрээр илэрхийлэгддэг бөгөөд зураасаар тусгаарлагдсан 8-4-4-4-12 хэлбэртэй байдаг. Зураас нь уншихад хялбар болгодог боловч зарим системд (жишээ нь, өгөгдлийн санд) зураасыг хадгалах шаардлагагүй. Хэрэв та зураасыг хасахад 32 тэмдэгтийн hex мөр үлддэг. Энэ нь хадгалах орон зайг багасгадаг (36 байтаас 32 байт) боловч уншихад илүү төвөгтэй болдог.
Том үсэг ашиглах нь зөвхөн харагдах байдалд нөлөөлдөг. UUID стандарт нь жижиг үсгийг санал болгодог боловч том үсгээр бичсэн UUID-г ч зөв гэж үздэг. Зарим системүүд (жишээ нь, Windows-ийн зарим бүрэлдэхүүн хэсгүүд) том үсгээр харуулахыг илүүд үздэг. Энэ хэрэгсэл нь хэрэглэгчийн сонголтыг хүндэтгэдэг: том үсгийн түлхүүр дээр дарснаар бүх үсэг том болно.
UUID v7-ийн хэрэглээний бодит жишээнүүд: Үйл явдлын тунхаглал, аудит тэмдэглэл, мессежийн систем
UUID v7 нь ялангуяа дараах тохиолдолд ашигтай:
- Үйл явдлын тунхаглал (Event Sourcing): Үйл явдлуудыг хронологийн дарааллаар хадгалах шаардлагатай. UUID v7 нь үйл явдлын ID-уудыг цаг хугацаагаар эрэмблэх боломжийг олгодог бөгөөд энэ нь тунхаглалыг дахин тоглуулахад хялбар болгодог.
- Аудит тэмдэглэл (Audit Trails): Аливаа үйлдлийг тодорхой цаг хугацаанд тэмдэглэх шаардлагатай. UUID v7 нь аудит тэмдэглэлийн ID-уудыг цаг хугацаагаар эрэмблэх боломжийг олгодог бөгөөд энэ нь ирээдүйд дүн шинжилгээ хийхэд чухал.
- Мессежийн системүүд (Messaging Systems): Мессежүүдийг дарааллаар боловсруулах шаардлагатай. UUID v7 нь мессежүүдийн ID-уудыг хронологийн дарааллаар эрэмблэх боломжийг олгодог боловч нэг миллисекундын дотор ирсэн мессежүүдийн дараалал нь тэдгээрийн санамсаргүй хэсгээс хамаарна гэдгийг анхаарах хэрэгтэй.
FAQ (Байнгын асуултууд)
1. UUID v7 нь UUID v4-ээс илүү аюулгүй юу?
Тийм эсвэл үгүй. Аюулгүй байдал нь таамаглах боломжоор хэмжигддэг. UUID v4 нь 122 бит санамсаргүй байдаг бол UUID v7 нь 74 бит санамсаргүй байдаг (48 бит цагийн тэмдэг нь мэдэгдэж болзошгүй). Хэрэв дайсан цагийн тэмдгийг мэддэг бол (жишээ нь, ID-г харсан) UUID v7-ийн санамсаргүй орон зай нь UUID v4-ээс бага. Гэхдээ ихэнх хэрэглээнд 74 битийн санамсаргүй орон зай нь хангалттай том (2^74 ≈ 1.8 x 10^22) бөгөөд таамаглах боломжгүй юм.
2. Би өгөгдлийн сандаа UUID v7-г гол түлхүүр болгон ашиглаж болох уу?
Тийм. Учир нь энэ нь цаг хугацаанд суурилсан эрэмбэлэлттэй тул оруулах гүйцэтгэлийг сайжруулдаг. Гэхдээ нэг миллисекундын дотор олон ID үүсгэх үед хэсэгчлэн эрэмбэлэгдээгүй байдал үүсч болзошгүйг анхаарах хэрэгтэй. Энэ нь ихэнх өгөгдлийн сангийн хэрэглээнд саатал үүсгэдэггүй.
3. UUID v7 нь ULID-ээс ялгаатай юу?
Тийм. Хоёулаа цаг хугацаанд суурилсан боловч ULID нь 26 тэмдэгтийн Crockford-ийн Base32 кодчилол ашигладаг бол UUID v7 нь стандарт 36 тэмдэгтийн hex формат ашигладаг. ULID нь мөн илүү нарийвчлалтай цагийн тэмдэг (миллисекунд + санамсаргүй) ашиглах боломжтой боловч стандарт биш.
4. Энэ хэрэгсэл хэдэн ID үүсгэх вэ?
Нэг удаад 1-ээс 100 хүртэлх ID-г үүсгэх боломжтой. Хэрэв та илүү их тоо хэрэгтэй бол хэд хэдэн удаа үүсгэж болно.
5. UUID v7-г хэрхэн өгөгдлийн санд хадгалах вэ?
Хамгийн сайн арга нь BINARY(16) (128 бит) багана хэлбэрээр хадгалах. Текст хэлбэрээр (CHAR(36)) хадгалах нь илүү их зай эзэлдэг (36 байт). Мөн зураасыг хасаж, 32 тэмдэгтийн hex мөрөөр хадгалах боломжтой, гэхдээ энэ нь 32 байт байх болно.
6. Нэг миллисекундын дотор үүсгэсэн ID-ууд хэзээ нэгэн цагт мөргөлдөх боломжтой юу?
Тийм, онолын хувьд. Нэг миллисекундын дотор 2^74 ID үүсгэвэл мөргөлдөх магадлал нэг рүү ойртоно. Практикт та хэзээ ч ийм олон ID үүсгэхгүй тул мөргөлдөх магадлал маш бага (жишээ нь, 1 сая ID үүсгэхэд мөргөлдөх магадлал ойролцоогоор 2^74 / 10^6 ≈ 1.8 x 10^16-ийн нэг).
Дүгнэлт
Энэхүү UUID v7 үүсгэгч хуудас нь хөгжүүлэгчдэд цаг хугацаанд суурилсан, таахад хэцүү идентификаторуудыг хурдан бөгөөд аюулгүй гаргах боломжийг олгодог. Хэрэгсэл нь локал хөтөч дээр ажилладаг тул нууцлал хадгалагдаж, гүйцэтгэл өндөр байдаг. UUID v7-ийн гол давуу тал нь UUID v4-тэй харьцуулахад өгөгдлийн сангийн индекс асуудлыг шийддэгт оршино. Гэхдээ нэг миллисекундын дотор үүссэн ID-уудын хатуу эрэмбэ хангагдахгүй гэдгийг санах хэрэгтэй. Хэрэв танд нарийн хронологийн дараалал хэрэгтэй бол өөр шийдлийг (жишээ нь, дарааллын тоолуур нэмэх) бодолцох хэрэгтэй. Энэ хэрэгсэл нь B-модны индекс гүйцэтгэлийг сайжруулах, аудит тэмдэглэл, үйл явдлын тунхаглал, мессежийн систем зэрэгт маш тохиромжтой.