יוצר CUID יעיל למזהים ייחודיים במערכות
מחולל CUID היוצר מזהה ייחודי מסוג CUID2 העמיד בפני התנגשויות, בדפדפן וללא עלות. המזהים ניתנים למיון וקנה מידה, למפתחות מסדי נתונים ומערכות מבוזרות.
מחולל CUID
צור מזהה עמיד לתנגשויות במהירות ובקלות.
תיעוד
מהו CUID?
CUID (מזהה ייחודי עמיד בפני התנגשויות) הוא מחרוזת קצרה של אותיות וספרות המשמשת לסימון רשומה, קובץ או אירוע, כך שלא יהיו שני פריטים בעלי אותו שם. כלי זה מייצר CUID2, הגרסה הנוכחית של הפורמט, באמצעות הספרייה @paralleldrive/cuid2. כל מזהה הוא באורך 25 תווים, מכיל רק אותיות קטנות וספרות, ונוצר כולו בדפדפן — שום דבר לא נשלח לשרת.
כיצד להשתמש במחולל CUID זה
- לחצו על יצירת CUID חדש כדי ליצור מזהה.
- לחצו על העתקה ללוח כדי להעתיק אותו.
- הדביקו את המזהה במסד נתונים, בשם קובץ או ביישום.
- לחצו שוב על יצירה כדי לקבל מזהה נוסף. התנגשויות בין ערכי CUID2 נפרדים אינן סבירות ביותר, אף שאינן בלתי אפשריות מבחינה מתמטית.
- לחצו על איפוס כדי לנקות את התוצאה.
המזהה שנוצר נשמר גם בכתובת ה-URL של הדף, כך שאפשר לשתף קישור לתוצאה או לשמור אותו כסימנייה.
המבנה והנוסחה של CUID2
CUID2 נבנה כך:
1id = randomLetter + base36( SHA3-512( time + entropy + counter + fingerprint ) ).substring(1, length)
2פונקציית הגיבוב משלבת ארבעה קלטים פרטיים: הזמן הנוכחי, מונה לכל הפעלה, טביעת אצבע של המחשב המארח ואנטרופיה אקראית. היא מעבירה אותם דרך SHA3-512, ממירה את התוצאה לבסיס 36 (ספרות 0–9 והאותיות a-z), ולאחר מכן שומרת 24 מהתווים האלה. האות הראשונה האקראית מביאה את המזהה המוגמר לאורך של 25 תווים, שהוא האורך שהוגדר לכלי זה.
רק התוו הראשון עומד בפני עצמו: אות אקראית המוצבת בתחילת המזהה, כך שכל מזהה יתחיל באות ולא בספרה. מערכות רבות, כגון שמות של טבלאות ועמודות ב-SQL, דורשות שמזהים יתחילו באות, ולכן כך אפשר להשתמש ב-CUID2 כשם כמעט בכל מקום. כל תו אחרי האות הראשונה הוא חלק מגוף גיבוב רציף ואטום אחד — אין בו מקטעים נפרדים.
מאחר שהגיבוב פועל בכיוון אחד בלבד, אי אפשר לחלץ ממנו את הקלטים שלו מתוך המזהה המוגמר. ל-CUID2 אין חותמת זמן הניתנת לשחזור, מונה הניתן לשחזור או טביעת אצבע הניתנת לשחזור. זוהי בחירה מכוונת של פרטיות ואבטחה: מזהה לבדו אינו יכול לחשוף מתי או היכן נוצר.
דוגמה פתורה
יצירת מזהה באמצעות כלי זה עשויה להניב:
1vcpuhcj51eomj1o31dnlqopu0
2כאן v היא האות הראשונה האקראית, ו-cpuhcj51eomj1o31dnlqopu0 (24 תווים) הוא גוף הגיבוב. שני החלקים נראים שונים רק משום שהתוו הראשון מובטח להיות אות — גוף הגיבוב יכול להכיל שילוב של אותיות וספרות.
מדוע מערכות משתמשות ב-CUID2
- אין צורך בתיאום. כל מחשב יכול ליצור מזהה תקף בעצמו, בלי לבקש משרת מרכזי או ממסד נתונים את הערך הבא.
- עמידות בפני התנגשויות. השילוב של זמן, מונה, טביעת אצבע של המחשב המארח ואנטרופיה אקראית הופך את הסבירות לכך ששני מחשבים יפיקו אותו מזהה לנמוכה ביותר, גם כאשר נוצרים מזהים רבים בשנייה.
- מתאים לכתובות URL. CUID2 משתמש רק באותיות קטנות ובספרות, ולכן לעולם אין צורך לקודד אותו לשימוש בכתובת אינטרנט.
- יצירה מהירה ופרטית. מאחר שכלי זה מפעיל את המחולל בדפדפן, המזהים נוצרים מיד ואינם עוזבים את המכשיר.
מזהי CUID2 אינם ניתנים למיון לפי זמן היצירה. בניגוד למספר הגדל אוטומטית במסד נתונים או לפורמט CUID הישן יותר (גרסה 1), CUID2 מסתיר את חותמת הזמן בתוך הגיבוב במקום לאחסן אותה באופן גלוי. יישומים שצריכים למיין רשומות לפי סדר היצירה צריכים לאחסן עמודת חותמת זמן נפרדת לצד המזהה.
CUID2 לעומת UUID לעומת מזהים הגדלים אוטומטית
| תכונה | CUID2 | UUID v4 | גידול אוטומטי |
|---|---|---|---|
| אורך | 25 תווים | 36 תווים (עם מקפים) | משתנה (בדרך כלל מספר קצר) |
| קבוצת תווים | אותיות קטנות וספרות | ספרות הקסדצימליות ומקפים | ספרות |
| דורש תיאום מרכזי | לא | לא | כן (רצף של מסד נתונים) |
| ניתן למיון לפי זמן היצירה | לא | לא | כן |
| מתאים לכתובת URL ללא קידוד | כן | כן | כן |
CUID2 ו-UUID v4 פותרים את אותה בעיה: יצירת מזהים ללא תיאום מרכזי. CUID2 קצר יותר ומשתמש בקבוצת תווים מצומצמת יותר, ולכן קל יותר לקרוא אותו ולהדביק אותו בכתובת URL. UUID בטוח גם הוא לשימוש בכתובת אינטרנט, משום שהמקף הוא תו שאינו דורש קידוד בכתובות URL, אך הוא ארוך ב-11 תווים.
שימושים נפוצים
- מפתחות ראשיים במסדי נתונים מבוזרים, שבהם כמה שרתים מכניסים שורות באופן עצמאי
- מזהי בקשות או מזהי מעקב המשמשים למעקב אחר פעולה אחת בכמה שירותי מיקרו
- שמות קבצים להעלאות, כך ששני קבצים לעולם לא יחליפו זה את זה
- מזהי הפעלות או אסימונים ליישומי אינטרנט
- מזהי הודעות בתורים כגון Kafka או RabbitMQ
היסטוריה קצרה
פורמט CUID המקורי פורסם על ידי Eric Elliott בשנת 2012 כחלופה ל-UUID עבור יישומים מבוזרים. CUID2, שפורסם על ידי אותו פרויקט Paralleldrive, עיצב מחדש את הפורמט סביב גיבוב קריפטוגרפי והסיר את חותמת הזמן והמונה הניתנים לשחזור שהגרסה המקורית חשפה. כלי זה מייצר רק מזהי CUID2.
שאלות נפוצות
מה ההבדל בין CUID (גרסה 1) לבין CUID2? CUID v1 אחסן בתוך המזהה חותמת זמן ומונה גלויים, מה שהפך את המזהים לניתנים למיון אך גם חשף מתי וכמה מזהים נוצרו. CUID2 מחליף את השדות הגלויים האלה בגיבוב חד־כיווני, כך שלא ניתן לקרוא שום מידע מתוך המזהה.
האם מזהי ה-CUID שנוצרים בכלי זה ניתנים למיון לפי זמן היצירה? לא. ל-CUID2 אין חותמת זמן הניתנת לשחזור, ולכן אי אפשר לסדר את המזהים לפי מועד יצירתם רק מהתבוננות במחרוזת.
מהו אורכו של מזהה שנוצר, והאם אפשר לשנות את האורך? כלי זה מייצר תמיד מזהים באורך 25 תווים. בכלי זה אין אפשרות לבקש אורך אחר.
האם שני מחשבים שונים יכולים ליצור את אותו CUID2 באותו זמן? באופן תאורטי זה אפשרי, אך בפועל הסבירות לכך נמוכה ביותר. כל מזהה משלב טביעת אצבע ייחודית למחשב עם אנטרופיה אקראית, ולכן הסבירות שמחשבים עצמאיים יפיקו אי־פעם אותו גיבוב נמוכה ביותר.
האם כלי זה שולח נתונים כלשהם לשרת? לא. המזהה נוצר באמצעות JavaScript הפועל בדפדפן, תוך שימוש בשעון המקומי של המערכת ובאקראיות שמספק הדפדפן. שום דבר אינו משודר.
האם אפשר להשתמש ב-CUID2 כמפתח ראשי במסד נתונים?
כן. מזהי CUID2 מתאימים היטב כמפתחות ראשיים במסדי נתונים מבוזרים, מכיוון שכל צומת יכול ליצור מזהה בלי לבדוק מול רצף מרכזי. הם אינם ממוינים באופן טבעי לפי זמן ההוספה, ולכן יישום הזקוק לסדר זה צריך לשמור עמודת created_at נפרדת.