ULID გენერატორი

გენერირება ULID მნიშვნელობების ონლაინ: 26-სიმბოლოიანი Crockford Base32 იდენტიფიკატორები 48-ბიტიანი დროითა და 80 შემთხვევითი ბიტით.

ფორმატი
გენერირებული ID-ები
მზადაა. დააგენერირეთ ULID-ები თქვენს ბრაუზერში.

როგორ იქმნება ეს ID

სტრუქტურა
26 Crockford Base32 სიმბოლო: 10 დროის სიმბოლო, რომელსაც მოსდევს 16 შემთხვევითი სიმბოლო.
ენტროპია
80 შემთხვევითი ბიტი 48-ბიტიანი მილიწამების დროის შტამპის შემდეგ.
დრო
დიახ. პირველი 10 სიმბოლო აკოდირებს დროს მილიწამებში, ხოლო ლექსიკური თანმიმდევრობა მიჰყვება დროს.
კოლიზიის რისკი
შემთხვევითი ბოლო ნაწილი შეიცავს 80 ბიტს; რისკი ძირითადად დამოკიდებულია იმაზე, თუ რამდენ ID-ს ქმნით ერთსა და იმავე მილიწამში.
მაგალითი
01M12BRPZY1S80NA3D7QJ5RKBK

თქვენი ID-ები გენერირდება ლოკალურად ბრაუზერის ძლიერი შემთხვევითობის გამოყენებით. BroBroGo-ზე არაფერი იგზავნება.

ხშირად დასმული კითხვები

რისთვის არის კარგი ULID?

ULID არის კომპაქტური, მოსახერხებელია URL-ისთვის და სორტირებადია დროის მიხედვით როგორც ჩვეულებრივი ტექსტი, რაც სასარგებლოა ლოგებისთვის, ობიექტების გასაღებებისთვის და ჩანაწერებისთვის, რომლებიც უნდა დალაგდეს შექმნის დროის მიხედვით.

არის თუ არა ULID იგივე, რაც UUID v7?

არა. მიუხედავად იმისა, რომ ორივე მოიცავს დროს მილიწამებში, ULID იყენებს Crockford Base32-ს და 26 სიმბოლოს, ხოლო UUID v7 ინარჩუნებს სტანდარტულ UUID თექვსმეტობით ფორმას.

დახმარება, ეს არის ინსტრუქცია, რომელიც მოითხოვს სრულ სტატიას ქართულ ენაზე, ULID-ის გენერატორის გვერდზე. მე ვხედავ, რომ მომხმარებელმა მთარგმნელობითი პრობლემა მოიტანა - ინგლისური ინსტრუქცია ითარგმნა ქართულად, მაგრამ თარგმანი ზედმეტად ზუსტია, ინგლისური გრამატიკის დაცვით, რაც ქართულად ბუნებრივად არ ჟღერს.

მე ვხედავ, რომ პასუხი იწყება "დახმარება, ეს არის ინსტრუქცია..." - ეს ნიშნავს, რომ მომხმარებელმა ინსტრუქცია ან ფაქტების ფურცელი მოიტანა, მაგრამ მისი ფორმატირება და სტრუქტურა შეიცვალა.

ჩემი ამოცანაა გავაგრძელო თარგმანი ან გადავწერო ეს ინსტრუქცია ბუნებრივ, გასაგებ ქართულ ენაზე, ისე, რომ შენარჩუნდეს ყველა მნიშვნელოვანი ინფორმაცია ULID-ის გენერატორის შესახებ.

ფაქტების ფურცელში ნათქვამია:

  • ULID არის 26-სიმბოლოიანი უნიკალური იდენტიფიკატორი
  • იყენებს Crockford-ის base32 ანბანს
  • 10 პირველი სიმბოლო წარმოადგენს დროის შტამპს
  • 128 ბიტიანია მთლიანობაში
  • გენერირება ხდება ბრაუზერში, არ იგზავნება სერვერზე

მე უნდა დავწერო სტატია, რომელიც:

  1. შეესაბამება ფაქტების ფურცელს
  2. გამოიყენებს ბუნებრივ ქართულ ენას
  3. იქნება მინიმუმ 1100 სიტყვა
  4. შეიცავს FAQ-ს 4-6 კითხვით
  5. 5-7 H2 განყოფილებას

ახლა დავიწყებ სტატიის წერას.# ULID-ის გენერატორი: დროში გასაწყობი უნიკალური იდენტიფიკატორები

რა არის ULID და რით განსხვავდება ის UUID-სგან

ULID (Universally Unique Lexicographically Sortable Identifier) არის 26-სიმბოლოიანი იდენტიფიკატორი, რომელიც შედგება მხოლოდ Crockford-ის base32 ანბანის სიმბოლოებისგან. ეს ანბანი მოიცავს ციფრებს 0-9 და ასოებს A-Z-დან, გამოკლებულია I, L, O, U — რაც გამორიცხავს ვიზუალურად არამკაფიო სიმბოლოებს. ULID-ის მთავარი განსხვავება UUID-სგან არის ის, რომ ის 10 სიმბოლოთი მოკლეა (26 vs 36), არ შეიცავს დეფისებს, და, რაც ყველაზე მნიშვნელოვანია, მისი ლექსიკოგრაფიულად დალაგება შესაძლებელია შექმნის დროის მიხედვით.

პირველი 10 სიმბოლო შეიცავს მილიწამების სიზუსტის დროის შტამპს (48 ბიტი), ხოლო დარჩენილი 16 სიმბოლო (80 ბიტი) არის შემთხვევითი კომპონენტი. მთლიანობაში ULID იკავებს 128 ბიტს — იგივე მოცულობას, რასაც UUID v4. იმის გამო, რომ ULID იყენებს მხოლოდ Crockford-ის base32 ანბანს, ის არ განასხვავებს მთავრულ და ნაბეჭდ ასოებს, რაც ნიშნავს, რომ 01ARZ3NDEKTSV4RRFFQ69G5FAV და 01arz3ndektsv4rrffq69g5fav ერთი და იგივე იდენტიფიკატორია.

ULID-ის შიდა სტრუქტურა: დროის შტამპი და შემთხვევითი ნაწილი

ULID-ის 128 ბიტი ორ ნაწილად იყოფა. პირველი 48 ბიტი (6 ბაიტი) განკუთვნილია მილიწამების სიზუსტის Unix-ის დროის შტამპისთვის. ეს ნიშნავს, რომ ULID-ს შეუძლია წარმოადგინოს დრო 1970 წლის 1 იანვრიდან 10889 წლამდე, რაც პრაქტიკულად ნებისმიერი თანამედროვე სისტემისთვის საკმარისია. დროის შტამპი იწერება Crockford-ის base32-ში, რაც იძლევა 10 სიმბოლოს.

დარჩენილი 80 ბიტი (10 ბაიტი) არის შემთხვევითი მნიშვნელობა, რომელიც უზრუნველყოფს უნიკალურობას. ეს 80 ბიტი 16 სიმბოლოდ იქცევა base32-ში. შემთხვევითი კომპონენტის 80-ბიტიანი სივრცე ნიშნავს, რომ თეორიულად 2^80 სხვადასხვა მნიშვნელობაა შესაძლებელი, რაც კოლიზიის ალბათობას პრაქტიკულად უმნიშვნელოდ აქცევს — მაშინაც კი, თუ წამში მილიარდობით ULID იქმნება.

მნიშვნელოვანია გვესმოდეს, რომ ULID-ები, რომლებიც ერთსა და იმავე მილიწამში იქმნება, არ არის გარანტირებული, რომ დალაგდება შექმნის თანმიმდევრობით. ეს იმიტომ ხდება, რომ შემთხვევითი ნაწილი არ არის თანმიმდევრული — ის უბრალოდ შემთხვევითი მნიშვნელობაა. თუ თქვენ გჭირდებათ ზუსტი თანმიმდევრობა ერთი მილიწამის ფარგლებში, ULID ამის გარანტიას არ იძლევა.

Crockford-ის base32: რატომ არის ULID რეგისტრის მიმართ გულგრილი

Crockford-ის base32 ერთ-ერთი ყველაზე ჭკვიანი ინჟინერული გადაწყვეტილებაა იდენტიფიკატორების დიზაინში. ის იყენებს 32 სიმბოლოს: ციფრებს 0-9 (10 სიმბოლო) და ასოებს A-Z-დან, გამოკლებული I, L, O, U (22 სიმბოლო). ეს 32 სიმბოლო იდეალურია 5-ბიტიანი მნიშვნელობების წარმოსაჩენად (2^5 = 32).

I, L, O, U ასოების გამოკლება ხდება ვიზუალური დაბნეულობის თავიდან ასაცილებლად. I და L შეიძლება აგვერიოს 1-ში ან ერთმანეთში, O შეიძლება აგვერიოს 0-ში, ხოლო U — V-ში. Crockford-ის ანბანი საშუალებას იძლევა, რომ მთავრული და ნაბეჭდი ასოები განიხილებოდეს ექვივალენტურად, რაც განსაკუთრებით მნიშვნელოვანია, როდესაც იდენტიფიკატორები ხელით გადაიწერება ან ტელეფონით ნაკარნახევია.

ფაქტობრივად, Crockford-ის base32 არის ის მიზეზი, რის გამოც ULID-ის გენერატორის გვერდს არ აქვს ცალკე ღილაკი რეგისტრის ან დეფისების ჩასართავად. ULID უბრალოდ არ საჭიროებს ასეთ ტოგლებს — ის ბუნებრივად რეგისტრის მიმართ გულგრილია და არასდროს შეიცავს დეფისებს.

ლექსიკოგრაფიული დალაგება: რატომ ჯობია ULID მონაცემთა ბაზებში

ULID-ის ერთ-ერთი ყველაზე მნიშვნელოვანი უპირატესობა UUID v4-თან შედარებით არის მისი ლექსიკოგრაფიული დალაგების უნარი. UUID v4 არის მთლიანად შემთხვევითი, რაც ნიშნავს, რომ მისი B-ხეზე ინდექსირება იწვევს ცუდ შესრულებას — ახალი ჩანაწერები ხვდება ხის შემთხვევით ადგილებში, რაც იწვევს ხშირ გვერდის გაყოფას.

ULID-ის პირველი 10 სიმბოლო წარმოადგენს მილიწამების დროის შტამპს, რაც ნიშნავს, რომ ახალი ULID-ები ყოველთვის უფრო დიდია, ვიდრე ძველი. ეს იწვევს იმას, რომ B-ხის ჩანაწერები თანმიმდევრულად ემატება მარჯვენა მხარეს, რაც მნიშვნელოვნად აუმჯობესებს ჩაწერის შესრულებას. PostgreSQL-ში, MySQL-ში ან SQLite-ში, სადაც ინდექსები B-ხეებითაა რეალიზებული, ეს განსხვავება შეიძლება იყოს 5-10-ჯერ ჩაწერის სიჩქარეში.

თუმცა, უნდა გვესმოდეს, რომ ULID-ის დალაგება ზუსტია მხოლოდ მილიწამების დონეზე. თუ ორი ULID ერთსა და იმავე მილიწამში იქმნება, მათი თანმიმდევრობა განისაზღვრება შემთხვევითი ნაწილის მიხედვით, რაც შეიძლება არ ემთხვეოდეს მათი შექმნის ფაქტიურ თანმიმდევრობას.

URL-უსაფრთხოება და ლოკალური გენერაცია

ULID-ის ყველა სიმბოლო (0-9, A-Z გარდა I, L, O, U) არის unreserved სიმბოლო RFC 3986-ის მიხედვით. ეს ნიშნავს, რომ ULID-ის URL-ში ჩასმა არ საჭიროებს percent-encoding-ს — ის პირდაპირ შეიძლება გამოვიყენოთ URL-ის ნაწილად, query-პარამეტრად ან fragment-ად. UUID v4, პირიქით, შეიცავს დეფისებს, რომლებიც ტექნიკურად unreserved-ია, მაგრამ ბევრი სისტემა მათ სხვანაირად განმარტავს.

ULID-ის გენერატორი მუშაობს მთლიანად ბრაუზერში. ის იყენებს crypto.getRandomValues() ფუნქციას, რაც ნიშნავს, რომ შემთხვევითი მნიშვნელობები იქმნება ბრაუზერის ჩაშენებული კრიპტოგრაფიული მოდულის მიერ. არც ერთი ინფორმაცია — არც დროის შტამპი, არც IP მისამართი, არც User-Agent — არ იგზავნება სერვერზე. ეს განსაკუთრებით მნიშვნელოვანია იმ გარემოში, სადაც მონაცემთა კონფიდენციალურობა კრიტიკულია.

გენერატორი იძლევა 1-დან 100-მდე ULID-ის ერთდროულად გენერირების საშუალებას. თითოეული ULID-ის დაჭერით ის კოპირდება ინდივიდუალურად, ხოლო "Copied all!" სტატუსი გამოჩნდება, როდესაც მთელი სია ერთდროულად კოპირდება.

პრაქტიკული გამოყენება: ვის სჭირდება ULID

ULID-ის მთავარი აუდიტორია არიან ვებ-დეველოპერები, მონაცემთა ბაზის ადმინისტრატორები და სისტემური არქიტექტორები, რომლებიც მუშაობენ განაწილებულ სისტემებზე. API-ების დიზაინერები ხშირად ირჩევენ ULID-ს, რადგან ის უზრუნველყოფს უნიკალურობას, მაგრამ ამავდროულად უფრო ადვილია ადამიანისთვის წაკითხვა, ვიდრე UUID — განსაკუთრებით მაშინ, როდესაც ID-ები ტელეფონზე ან ნაბეჭდ მასალაზეა ნაჩვენები.

მაგალითად, 01ARZ3NDEKTSV4RRFFQ69G5FAV გაცილებით ადვილია წარმოთქმა, ვიდრე 550e8400-e29b-41d4-a716-446655440000. 26 სიმბოლო 36-ის ნაცვლად, დეფისების არარსებობა და რეგისტრის მიმართ გულგრილობა — ეს ყველაფერი ULID-ს უფრო ადამიანურად აქცევს.

ხშირად დასმული კითხვები

რა არის ULID-ის კოლიზიის ალბათობა? 80-ბიტიანი შემთხვევითი კომპონენტი იძლევა 2^80 ≈ 1.2 × 10^24 შესაძლო მნიშვნელობას. კოლიზიის ალბათობა ერთი მილიწამის ფარგლებში, თუ 1000 ULID იქმნება, არის დაახლოებით 10^-18, რაც პრაქტიკულად ნულის ტოლია.

შეიძლება თუ არა ULID-ის გამოყენება UUID-ის ნაცვლად? დიახ, ULID იკავებს 128 ბიტსაც — იგივე მოცულობას, რასაც UUID v4. ის შეიძლება გამოყენებულ იქნას როგორც UUID-ის პირდაპირი ჩანაცვლება იმ სისტემებში, სადაც 128-ბიტიანი მონაცემთა ტიპია გამოყენებული.

რატომ არის ULID 26 სიმბოლო, UUID კი 36? UUID 36 სიმბოლოა, რადგან ის იწერება 32 hexadecimale ციფრის + 4 დეფისის სახით (8-4-4-4-12 ფორმატი). ULID იყენებს base32-ს, სადაც თითოეული სიმბოლო 5 ბიტს წარმოადგენს, 4-ის ნაცვლად (hexadecimal). 128 ბიტი / 5 ბიტი = 25.6, რაც მრგვალდება 26-მდე.

რა ხდება, თუ ULID-ის გენერატორი 100-ზე მეტ ID-ს ვითხოვ? გენერატორი იღებს მხოლოდ 1-დან 100-მდე მნიშვნელობებს. 100-ზე მეტის მითითება უბრალოდ არ მუშავდება — ინტერფეისი არ იძლევა ასეთი რაოდენობის შეყვანის საშუალებას.

შეიძლება ULID-ის გამოყენება ბაზის პირველად გასაღებად? დიახ, და ეს მისი ერთ-ერთი მთავარი გამოყენების სფეროა. ULID-ის მონოტონურად ზრდადი ბუნება (დროის შტამპის გამო) აუმჯობესებს B-ხის ინდექსის შესრულებას შემთხვევით UUID-თან შედარებით.