Whiz Tools

גנרטור ULID

ULID שנוצר:

מבנה ULID


חותמת זמן (10 תווים)

אקראיות (16 תווים)

ULID Generator

Introduction

ULID (מזהה ייחודי אוניברסלי מסודר לקסיקוגרפית) הוא מזהה ייחודי שמשלב חותמת זמן עם נתונים אקראיים כדי ליצור מיתר של 26 תווים. ULIDs תוכננו להיות מסודרים לקסיקוגרפית תוך שמירה על רמה גבוהה של ייחודיות ואקראיות.

Structure of a ULID

ULID מורכב משני חלקים עיקריים:

  1. חותמת זמן (10 תווים): 10 התווים הראשונים מייצגים את הזמן במילישניות מאז תקופת יוניקס (1970-01-01).
  2. אקראיות (16 תווים): 16 התווים הנותרים נוצרו בעזרת נתונים אקראיים מאובטחים מבחינה קריפטוגרפית.

המיתר בן 26 התווים המתקבל מקודד באמצעות אלפבית הבסיס 32 של קרוקפורד (0-9 ו-A-Z, למעט I, L, O ו-U).

Formula

ULID נוצר באמצעות הצעדים הבאים:

  1. הפקת חותמת זמן של 48 סיביות (מילישניות מאז תקופת יוניקס).
  2. הפקת 80 סיביות של נתונים אקראיים מאובטחים מבחינה קריפטוגרפית.
  3. קידוד 128 הסיביות המשולבות באמצעות קידוד הבסיס 32 של קרוקפורד.

Calculation

גנרטור ה-ULID מבצע את הצעדים הבאים:

  1. קבלת חותמת הזמן הנוכחית במילישניות.
  2. הפקת 10 בתים אקראיים (80 סיביות) באמצעות גנרטור מספרים אקראיים מאובטח מבחינה קריפטוגרפית.
  3. שילוב חותמת הזמן ונתוני האקראיות לאינטגרל של 128 סיביות.
  4. קידוד האינטגרל של 128 הסיביות באמצעות קידוד הבסיס 32 של קרוקפורד.

Use Cases

ULIDs שימושיים במגוון תרחישים, כולל:

  1. מפתחות בסיס נתונים: ULIDs יכולים לשמש כמזהים ייחודיים לרשומות בבסיס נתונים, תוך הבטחת ייחודיות וסדר.
  2. מערכות מפוזרות: בסביבות מפוזרות, ניתן לייצר ULIDs מבלי צורך בתיאום בין צמתים.
  3. יומן ומעקב: ULIDs יכולים לשמש לתיוג רשומות יומן או מעקב אחרי אירועים, תוך מתן מזהה ייחודי ומסודר.
  4. מזהים ידידותיים ל-URL: ULIDs בטוחים לשימוש ב-URL וניתן להשתמש בהם באפליקציות אינטרנט כמזהים ב-URL.

Alternatives

בעוד ש-ULIDs הם רב-תכליתיים, ישנם מערכות מזהים ייחודיים אחרות לשקול:

  1. UUID (מזהה ייחודי אוניברסלי): מזהה של 128 סיביות שאינו כולל רכיב חותמת זמן.
  2. KSUID (מזהה ייחודי מסודר K): דומה ל-ULID אך עם קידוד חותמת זמן שונה.
  3. מזהה Snowflake: מערכת ייצור מזהים ייחודיים מפוזרת של טוויטר, הכוללת חותמת זמן ומזהה עובד.

History

ULIDs הוצגו בשנת 2016 על ידי אליזין פיירסטה כאפשרות חלופית ל-UUIDs. הם תוכננו להתמודד עם כמה מגבלות של UUIDs, במיוחד מבחינת סדר וקריאות. המפרט של ULID נשאר יציב מאז הצגתו, עם יישומים שונים זמינים בשפות תכנות שונות.

Examples

הנה כמה דוגמאות קוד ליצירת ULIDs בשפות תכנות שונות:

// יישום ב-JavaScript
function generateULID() {
  const timestamp = Date.now().toString(36).padStart(10, '0');
  const randomness = crypto.getRandomValues(new Uint8Array(16))
    .reduce((acc, byte) => acc + byte.toString(36).padStart(2, '0'), '');
  return (timestamp + randomness).toUpperCase();
}

console.log(generateULID());
## יישום ב-Python
import time
import secrets
import base64

def generate_ulid():
    timestamp = int(time.time() * 1000).to_bytes(6, byteorder="big")
    randomness = secrets.token_bytes(10)
    return base64.b32encode(timestamp + randomness).decode("ascii").lower()

print(generate_ulid())
// יישום ב-Java
import java.security.SecureRandom;
import java.time.Instant;

public class ULIDGenerator {
    private static final SecureRandom random = new SecureRandom();
    private static final char[] ENCODING_CHARS = "0123456789ABCDEFGHJKMNPQRSTVWXYZ".toCharArray();

    public static String generateULID() {
        long timestamp = Instant.now().toEpochMilli();
        byte[] randomness = new byte[10];
        random.nextBytes(randomness);

        StringBuilder result = new StringBuilder();
        // קידוד חותמת הזמן
        for (int i = 9; i >= 0; i--) {
            result.append(ENCODING_CHARS[(int) (timestamp % 32)]);
            timestamp /= 32;
        }
        // קידוד אקראיות
        for (byte b : randomness) {
            result.append(ENCODING_CHARS[b & 31]);
        }
        return result.toString();
    }

    public static void main(String[] args) {
        System.out.println(generateULID());
    }
}

דוגמאות אלו מדגימות כיצד לייצר ULIDs ב-JavaScript, Python ו-Java. ניתן להתאים את הפונקציות הללו לצרכים הספציפיים שלך או לשלב אותן במערכות גדולות יותר שדורשות מזהים ייחודיים.

References

  1. "מפרט ULID." GitHub, https://github.com/ulid/spec. גישה 2 אוגוסט 2024.
  2. "קידוד בסיס 32 של קרוקפורד." קידוד בסיס 32, http://www.crockford.com/base32.html. גישה 2 אוגוסט 2024.
  3. "UUID מול ULID." Stack Overflow, https://stackoverflow.com/questions/54222235/uuid-vs-ulid. גישה 2 אוגוסט 2024.
משוב