דלג לתוכן

יוצר UUID חינמי - צור מזהים ייחודיים V1 ו-V4 מיידית

צור מזהים ייחודיים מיידית עם יוצר UUID החינמי שלנו. צור גרסאות 1 (מבוסס זמן) וגרסאות 4 (אקראיות) של UUID למסדי נתונים, API, ומערכות מבוזרות.

יוצר UUID

גרסת UUID
UUID שנוצר
מחשבון טעינה...
📚

תיעוד

מחולל UUID

מחולל UUID הוא כלי שיוצר מזהה ייחודי אוניברסלי, או UUID: קוד באורך 128 סיביות המשמש לסימון פריט נתונים, כך שסביר שאף פריט אחר, בשום מקום, לא יחזיק באותו סימון. דף זה יוצר UUIDs מגרסה 1 (מבוססת זמן) ומגרסה 4 (אקראית).

מהו UUID?

UUID הוא מספר באורך 128 סיביות, הכתוב באמצעות 32 ספרות הקסדצימליות (התווים 0–9 והאותיות a–f). הוא מחולק לחמש קבוצות המופרדות במקפים, בתבנית 8-4-4-4-12, ובסך הכול מכיל 36 תווים. UUID לדוגמה נראה כך:

1550e8400-e29b-41d4-a716-446655440000
2

UUIDs מוגדרים ב־RFC 9562, שפורסם על ידי כוח המשימה להנדסת האינטרנט במאי 2024 והחליף את RFC 4122 הישן יותר משנת 2005. שני המסמכים מתארים את אותו פורמט באורך 128 סיביות. תוכנות משתמשות בהם לזיהוי שורות במסדי נתונים, קבצים, הפעלות משתמש ורשומות אחרות, בלי צורך ברשות מרכזית שתקצה מספרים. מכיוון שמרחב ה־UUIDs האפשריים גדול כל כך, שני מחשבים יכולים ליצור UUIDs באופן בלתי תלוי ובאותו רגע, וכמעט לעולם לא ליצור אותו UUID.

פורמט ומבנה של UUID

128 הסיביות של UUID מחולקות לשדות בעלי שמות. כל שדה תופס מספר קבוע של סיביות:

  • time_low – 32 סיביות
  • time_mid – 16 סיביות
  • time_hi_and_version – 16 סיביות
  • clock_seq_hi_and_reserved – 8 סיביות
  • clock_seq_low – 8 סיביות
  • node – 48 סיביות
פריסת שדות UUID time_low time_mid time_hi seq_hi seq_lo node time_low: 32 bits time_mid: 16 bits time_hi_and_version: 16 bits clock_seq_hi_and_reserved: 8 bits clock_seq_low: 8 bits node: 48 bits

ארבע סיביות בתוך time_hi_and_version מכילות את מספר הגרסה של ה־UUID, ושתי סיביות בתוך clock_seq_hi_and_reserved מכילות את הווריאנט, המציין לתוכנה כיצד לקרוא את שאר השדות. מוגדרות שמונה גרסאות.

שמות השדות שלעיל לקוחים מגרסה 1, שבה הם אכן מכילים ערך זמן וערך צומת. גרסאות אחרות שומרות על אותה פריסה 8-4-4-4-12 ועל אותם גבולות שדות, אך ממלאות את רוב הסיביות בנתונים אקראיים. ב־UUID מגרסה 4 הקבוצה המסומנת time_low היא אקראית, ולא ערך זמן.

כיצד ליצור UUID באמצעות כלי זה

  1. בחרו גרסה: גרסה 1 (מבוססת זמן) או גרסה 4 (אקראית).
  2. קראו את ה־UUID מתיבת התוצאה. UUID חדש מופיע מיד עם טעינת הדף או עם שינוי הגרסה.
  3. בחרו באפשרות "Generate" כדי ליצור UUID נוסף.
  4. בחרו באפשרות "Copy" כדי להעתיק את התוצאה ללוח, ולאחר מכן הדביקו אותה בקוד, במסד נתונים או בקובץ תצורה.

החלונית שמתחת לתוצאה מחלקת את ה־UUID לחמשת השדות שלו ומציינת את שמו של כל אחד, כך שקל למצוא את ספרת הגרסה ואת ספרת הווריאנט.

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

UUID מגרסה 1 לעומת גרסה 4

גרסת 1 מקודדת את חותמת הזמן הנוכחית, וכן רצף שעון וערך צומת שנבחרו באקראי. התקן מאפשר לערך הצומת להיות כתובת הרשת האמיתית (MAC) של מחשב, אך מאפשר גם ערך צומת שנוצר באקראי כחלופה המגינה על הפרטיות. כלי זה משתמש תמיד באפשרות האקראית: מזהי ה־UUID שלו מגרסת 1 לעולם אינם קוראים או חושפים כתובת MAC אמיתית. התקן גם מחייב להגדיר ל־1 את הסיבית הנמוכה ביותר בבית הראשון של שדה הצומת כאשר ערך הצומת אקראי, וכלי זה עושה זאת. בכרטיסי רשת אמיתיים סיבית זו לעולם אינה מוגדרת, ולכן אי אפשר לטעות ולחשוב שצומת אקראי הוא צומת אמיתי. זו הסיבה שהספרה ההקסדצימלית השנייה בקבוצה החמישית תמיד אי־זוגית ב־UUID מגרסה 1 מדף זה: 1, 3, 5, 7, 9, b, d או f.

אפשר לקרוא את חותמת הזמן בתוך UUID מגרסה 1, ולכן ניתן לסדר רשומות לפי סדר יצירתן. מיון טקסט ה־UUID עצמו אינו עושה זאת, משום שהקבוצה הראשונה מכילה את 32 הסיביות הנמוכות ביותר של חותמת הזמן, והן מתאפסות בערך מדי 7 דקות. גרסה 6, שנוספה ב־RFC 9562, מאחסנת את אותה חותמת זמן כשהסיביות הגבוהות מופיעות ראשונות, כך שמיון טקסט רגיל פועל.

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

שש גרסאות נוספות קיימות בתקן, אך כלי זה אינו יוצר אותן: גרסה 2 (אבטחת DCE, בשימוש נדיר); גרסאות 3 ו־5, שנוצרות באמצעות גיבוב של מרחב שמות ושם עם MD5 או SHA־1, כך שאותו קלט תמיד יוצר אותו UUID; וגרסאות 6, 7 ו־8, שנוספו על ידי RFC 9562 בשנת (24,300 cm) 2024 עבור מזהים הניתנים למיון ומזהים מותאמים אישית.

כיצד לחשב UUID (נוסחה)

גרסה 4:

  1. צרו 128 סיביות אקראיות.
  2. הגדירו את ארבע סיביות הגרסה, כלומר את הספרה ההקסדצימלית הראשונה בקבוצה השלישית, ל־0100 (הקסדצימלי 4).
  3. הגדירו את שתי הסיביות העליונות בקבוצה הרביעית ל־10 (כך שהספרה ההקסדצימלית הראשונה בקבוצה זו תהיה 8, 9, a או b).

רק 122 מתוך 128 הסיביות הן אקראיות בפועל, מכיוון ש־6 סיביות מקובעות בשלבים 2 ו־3. כך מתקבלים 2^122, כלומר בערך 5.3 × 10^36, UUIDs אפשריים מגרסה 4.

גרסה 1:

  1. קחו את הזמן הנוכחי כמספר מרווחים של 100 ננו־שניות מאז 15 באוקטובר 1582, תאריך הרפורמה בלוח הגרגוריאני. בפועל זהו זמן Unix הרגיל באלפיות שנייה בתוספת 12,219,292,800,000, והכול מוכפל ב־10,000.
  2. חלקו את המספר בן 60 הסיביות לשלושה שדות: 32 הסיביות הנמוכות ביותר נכנסות ל־time_low, 16 הסיביות הבאות ל־time_mid, ו־12 הסיביות העליונות ל־time_hi_and_version.
  3. צרו רצף שעון באורך 14 סיביות, המשמש למניעת התנגשויות אם שעון המערכת מכוון לאחור.
  4. צרו ערך צומת באורך 48 סיביות, והגדירו את הסיבית הנמוכה ביותר בבית הראשון שלו ל־1.
  5. הגדירו את סיביות הגרסה ל־0001 ואת סיביות הווריאנט ל־10.

בכל גרסאות ה־UUID, המרחב המלא באורך 128 סיביות מכיל 2^128, כלומר בערך 3.4 × 10^38, ערכים אפשריים. המספר גדול כל כך שהתנגשויות אקראיות אינן חשש מעשי.

דוגמה פתורה

קריאת UUID מגרסה 4. קחו את הדוגמה שהוצגה קודם: 550e8400-e29b-41d4-a716-446655440000.

  • הקבוצה השלישית, 41d4: הספרה הראשונה היא 4, המציינת שזהו UUID מגרסה 4.
  • הקבוצה הרביעית, a716: הספרה הראשונה, a (בינארית 1010), מתחילה ב־10, סיביות הווריאנט הנדרשות.
  • הספרות ההקסדצימליות הנותרות הן המטען האקראי.

תוכנה הקוראת UUID זה בודקת את התבנית 4 ו־10 כדי לאמת את הפורמט, ולאחר מכן מתייחסת לשאר הערך כאל ערך אקראי אטום.

בניית UUID מגרסה 1. נניח שהשעון מציג 1,700,000,000,000 אלפיות שנייה של זמן Unix, שהם 14 בנובמבר 2023, 22:13:20 UTC.

  1. הוסיפו את ההיסט: 1,700,000,000,000 + 12,219,292,800,000 = 13,919,292,800,000 אלפיות שנייה.
  2. הכפילו ב־10,000 כדי לקבל מרווחים של 100 ננו־שניות: 139,192,928,000,000,000. בהקסדצימלי זה 01EE833B04AFC000.
  3. חלקו אותו: time_low = 04AFC000 (8 הספרות ההקסדצימליות הנמוכות ביותר), time_mid = 833B (4 הספרות הבאות), ו־12 הסיביות העליונות הן 1EE.
  4. הציבו את ספרת הגרסה 1 לפני 1EE, לקבלת time_hi_and_version = 11EE.

ה־UUID יהיה 04afc000-833b-11ee- ולאחריו רצף השעון וערך הצומת. תוכנה יכולה להפוך את ארבעת השלבים האלה כדי לשחזר מהמזהה את 14 בנובמבר 2023.

שימושים נפוצים ב־UUIDs

  • מפתחות ראשיים במסדי נתונים, במיוחד כאשר כמה שרתים יוצרים רשומות באותו זמן בלי לתאם זה עם זה.
  • אסימוני הפעלה ומפתחות API, בדרך כלל מגרסה 4, בשל הפרטיות שהיא מספקת.
  • מזהים לקבצים, אירועים ומשאבים במערכות מבוזרות כגון שירותים זעירים.
  • מזהי מכשירים ברשתות IoT גדולות, שבהן כל מכשיר יכול ליצור את המזהה שלו במצב לא מקוון.

החיסרון העיקרי הוא הגודל: UUID תופס 16 בתים של אחסון, לעומת 4 או 8 בתים עבור מונה מספרים שלמים פשוט, ובמסדי נתונים מסוימים יצירת אינדקס ל־UUIDs איטית יותר מאשר למספרים שלמים עוקבים.

חלופות ל־UUIDs

מספרים שלמים הגדלים אוטומטית קטנים ופשוטים יותר, אך אינם פועלים היטב כאשר יותר משרת אחד צריך להקצות מזהים באופן בלתי תלוי. מזהי Snowflake, שפותחו בטוויטר, משלבים חותמת זמן עם מזהה של עובד כדי ליצור מזהים קומפקטיים הניתנים למיון במערכת מבוזרת. ULIDs (מזהים ייחודיים אוניברסליים הניתנים למיון לקסיקוגרפי) הם פורמט חדש יותר, שנועד להיות גם אקראי וגם ניתן למיון לפי זמן היצירה, בניגוד ל־UUID רגיל מגרסה 4.

ההיסטוריה של תקן UUID

הרעיון של UUID החל בשנות ה־1980 בחברת Apollo Computer, כחלק ממערכת Network Computing System שלה. בהמשך אימצה קרן Open Software Foundation את הפורמט עבור Distributed Computing Environment שלה. כוח המשימה להנדסת האינטרנט פרסם את RFC 4122 בשנת (10,500 cm) 2005, והחליף אותו ב־RFC 9562 במאי 2024. RFC 9562 משאיר את כל הגרסאות הקודמות פעילות ללא שינוי ומוסיף את גרסאות 6, 7 ו־8.

שאלות נפוצות

למה משמש מחולל UUID? הוא יוצר מזהים ייחודיים עבור מסדי נתונים, מערכות מבוזרות, אסימוני הפעלה, מפתחות API ומזהי מכשירים, כך שאף שתי רשומות אינן צריכות לחלוק את אותו מזהה.

מה ההבדל בין UUID מגרסה 1 לגרסה 4? גרסה 1 מקודדת חותמת זמן שהתוכנה יכולה לקרוא כדי לשחזר את זמן היצירה. גרסה 4 אקראית לחלוטין ואינה מכילה חותמת זמן. הפלט של כלי זה בגרסה 1 משתמש בערך צומת שנוצר באקראי במקום בכתובת MAC אמיתית, ולכן אינו חושף גם מידע המזהה את המחשב.

האם גרסה 1 חושפת את כתובת ה־MAC שלי? לא באמצעות כלי זה. התקן מאפשר לשדה הצומת של UUID מגרסה 1 להכיל כתובת MAC אמיתית, אך מחולל זה ממלא תמיד את השדה בסיביות אקראיות ומגדיר את הסיבית המציינת שהערך אינו כתובת רשת אמיתית.

האם UUIDs מובטחים להיות ייחודיים? לא ניתן להבטיח ייחודיות מוחלטת בשום שיטת מזהים, אך המרחב באורך 128 סיביות מכיל בערך 3.4 × 10^38 ערכים אפשריים, ול־UUID מגרסה 4 יש בערך 5.3 × 10^36 ערכים אקראיים אפשריים. הסיכוי לכפילות קטן מספיק כדי להתעלם ממנו כמעט בכל שימוש מעשי.

האם אפשר להשתמש ב־UUID כמפתח ראשי במסד נתונים? כן. UUIDs מתאימים היטב כמפתחות ראשיים במערכות מבוזרות, משום שכל צומת יכול ליצור UUID בלי לתאם זאת עם שרת מרכזי. המחיר הוא 16 בתים של אחסון לכל מפתח, יותר ממספר שלם טיפוסי, וכן ביצועי אינדקס שעלולים להיות איטיים יותר בטבלאות גדולות מאוד.

האם UUID זהה ל־GUID? כן. GUID (מזהה ייחודי גלובלי) הוא השם של מיקרוסופט לאותו מושג, המוגדר ב־RFC 4122 כ־UUID.

האם ניתן למיין UUIDs מגרסה 4 לפי זמן היצירה? לא. UUIDs מגרסה 4 הם אקראיים, ולכן אינם מכילים מידע על מועד יצירתם. UUID מגרסה 1 כן מכיל מידע כזה, אך יש לפענח אותו תחילה; מיון הטקסט אינו מספק את סדר היצירה. גרסאות 6 ו־7 ו־ULIDs נועדו למיון ישיר כטקסט.

מקורות

  1. Davis, K., Peabody, B., & Leach, P. (2024). Universally Unique IDentifiers (UUIDs). RFC 9562. https://www.rfc-editor.org/rfc/rfc9562
  2. Leach, P., Mealling, M., & Salz, R. (2005). A Universally Unique IDentifier (UUID) URN Namespace. RFC 4122. https://www.rfc-editor.org/rfc/rfc4122
  3. מזהה ייחודי אוניברסלי. בתוך Wikipedia. https://en.wikipedia.org/wiki/Universally_unique_identifier
  4. מזהה Snowflake. בתוך Wikipedia. https://en.wikipedia.org/wiki/Snowflake_ID
  5. מפרט ULID. GitHub. https://github.com/ulid/spec