מדריך ל- UUID בג'אווה
1. סקירה כללית
UUID (מזהה ייחודי אוניברסלי), הידוע גם בשם GUID (מזהה ייחודי גלובלי) מייצג ערך ארוך של 128 סיביות הייחודי לכל המטרות המעשיות. הייצוג הסטנדרטי של ה- UUID משתמש בספרות hex (אוקטטות):
123e4567-e89b-12d3-a456-556642440000
UUID מורכב ממספרות משושה (4 תווים כל אחת) יחד עם 4 "-" סמלים ההופכים את זה אורך שווה ל -36 תווים.
ה- UUID Nil הוא צורה מיוחדת של UUID בה כל הביטים מוגדרים לאפס.
במאמר זה, נסתכל על ה- UUID בכיתה בג'אווה. ראשית, נבדוק כיצד להשתמש בכיתה עצמה. לאחר מכן, נבחן את הסוגים השונים של UUID וכיצד אנו יכולים ליצור אותם ב- Java.
2. ה UUID מעמד
בכיתת UUID יש בנאי יחיד:
UUID uuid = UUID חדש (long mostSignificant64Bits, long lessSignificant64Bits);
אם אנו רוצים להשתמש בבנאי זה, עלינו לספק שני ערכים ארוכים. עם זאת, זה מחייב אותנו לבנות את תבנית הסיביות עבור ה- UUID בעצמנו.
מטעמי נוחות, ישנן שלוש שיטות סטטיות ליצירת UUID. אלו הם:
UUID uuid = UUID.nameUUIDFromBytes (בתים [] בתים);
שיטה זו יוצרת UUID גרסה 3 ממערך הבתים הנתון.
UUID uuid = UUID.randomUUID ();
ה randomUUID () השיטה יוצרת UUID בגירסה 4. זוהי הדרך הנוחה ביותר ליצור UUID.
UUID uuid = UUID.fromString (מחרוזת uuidHexDigitString);
השיטה הסטטית השלישית מחזירה אובייקט UUID בהינתן ייצוג המחרוזות של UUID נתון.
בואו נסתכל כיצד מובנה UUID.
3. מבנה
בוא ניקח את הדוגמה UUID:
123e4567-e89b-42d3-a456-556642440000 xxxxxxxx-xxxx-Bxxx-Axxx-xxxxxxxxxxxx
3.1. משתנה UUID
א מייצג את הגרסה הקובעת את פריסת ה- UUID. כל שאר הסיביות ב- UUID תלויות בהגדרת הסיביות בשדה הגרסה. הגרסה נקבעת על ידי 3 סיביות משמעותיות ביותר של A:
MSB1 MSB2 MSB3 0 X X שמור (0) 1 0 X גרסה נוכחית (2) 1 1 0 שמור למיקרוסופט (6) 1 1 1 שמור לעתיד (7)
הערך של א ב- UUID שהוזכר הוא 'a'. המקבילה הבינארית של 'a' (= 10xx) מציגה את הגרסה כ -2.
3.2. גרסת UUID
ב מייצג את הגרסה. הגרסה ב- UUID המוזכרת (ערך של ב) הוא 4.
Java מספקת שיטות לקבלת גרסה וגרסה של UUID:
UUID uuid = UUID.randomUUID (); גרסה int = uuid.variant (); גרסת int = uuid.version ();
אלה 5 גרסאות שונות עבור וריאנט 2 UUID: מבוסס זמן (UUIDv1), DCE אבטחה (UUIDv2), מבוסס שמות (UUIDv3 ו- UUIDv5), אקראי (UUIDv4).
Java מספקת הטמעה ל- v3 ו- v4, אך מספקת גם בַּנַאִי ליצירת כל סוג של UUID:
UUID uuid = UUID חדש (ארוך mostSigBits, ארוך לפחותSigBits);
4. גרסאות ה- UUID
4.1. גרסה 1
גרסת UUID 1 מבוססת על חותמת הזמן הנוכחית, נמדדת ביחידות של 100 ננו-שניות מה -15 באוקטובר 1582, משורשרת עם כתובת ה- MAC של המכשיר בו נוצר ה- UUID.
אם פרטיות מהווה דאגה, ניתן לייצר את גרסת UUID 1 לחלופין עם מספר אקראי של 48 סיביות במקום כתובת ה- MAC.
במאמר זה נציג את החלופה הזו. ראשית, ניצור את 64 הביטים הנמוכים והמשמעותיים ביותר כערכים ארוכים:
פרטי סטטי ארוך get64LeastSignificantBitsForVersion1 () {אקראי אקראי = אקראי חדש (); ארוך אקראי 63BitLong = random.nextLong () & 0x3FFFFFFFFFFFFFFFL; גרסה ארוכה 3BitFlag = 0x8000000000000000L; החזר אקראי 63BitLong + variant3BitFlag; } פרטי סטטי ארוך get64MostSignificantBitsForVersion1 () {LocalDateTime התחלה = LocalDateTime.of (1582, 10, 15, 0, 0, 0); משך משך = Duration.between (התחל, LocalDateTime.now ()); שניות ארוכות = duration.getSeconds (); ננו ארוך = duration.getNano (); זמן רב ForUuidIn100Nanos = שניות * 10000000 + ננו * 100; ארוך לפחות12SignificatBitOfTime = (timeForUuidIn100Nanos & 0x000000000000FFFFL) >> 4; גרסה ארוכה = 1 << 12; return (timeForUuidIn100Nanos & 0xFFFFFFFFFFFF0000L) + גרסה + לפחות 12SignificatBitOfTime; }
לאחר מכן נוכל להעביר את שני הערכים לבנאי ה- UUID:
UUID סטטי ציבורי createType1UUID () {long most64SigBits = get64MostSignificantBitsForVersion1 (); ארוך לפחות64SigBits = get64LeastSignificantBitsForVersion1 (); להחזיר UUID חדש (most64SigBits, least64SigBits); }
4.2. גרסה 2
גרסה 2 מבוססת על חותמת זמן וגם על כתובת ה- MAC. עם זאת, RFC 4122 אינו מציין את פרטי הדור המדויק, ולכן לא נבחן יישום במאמר זה.
4.3. גרסה 3 ו -5
ה- UUID נוצרים באמצעות ה- hash של מרחב השמות והשם. מזהי מרחב השמות הם UUID כמו מערכת שמות תחומים (DNS), מזהי אובייקטים (OID), כתובות URL וכו '.
UUID = hash (NAMESPACE_IDENTIFIER + NAME)
ההבדל היחיד בין UUIDv3 ו- UUIDv5 הוא האלגוריתם Hashing - v3 משתמש ב- MD5 (128 ביטים) ואילו v5 משתמש ב- SHA-1 (160 ביטים).
במילים פשוטות, אנו מקטעים את הגיבוב המתקבל ל 128 סיביות ואז מחליפים 4 סיביות לגרסה ו -2 סיביות לגרסה.
בואו ניצור UUID מסוג 3:
בתים [] nameSpaceBytes = bytesFromUUID (מרחב שמות); בתים [] nameBytes = name.getBytes ("UTF-8"); בתים [] תוצאה = joinBytes (nameSpaceBytes, nameBytes); UUID uuid = UUID.nameUUIDFromBytes (תוצאה);
כאן, חשוב לציין כי יש להמיר תחילה את מחרוזת ה- hex עבור מרחב השמות למערך בתים.
Java אינה מספקת את ההטמעה לסוג 5. בדוק במאגר קוד המקור שלנו את ה- UUIDv5.
4.4. גרסה 4
יישום UUID v4 משתמש במספרים אקראיים כמקור. יישום Java הוא SecureRandom - שמשתמש בערך בלתי צפוי כזרע לייצור מספרים אקראיים כדי להפחית את הסיכוי להתנגשויות.
בואו ליצור גרסה 4 UUID:
UUID uuid = UUID.randomUUID ();
בואו ניצור מפתח ייחודי באמצעות 'SHA-256' ו- UUID אקראי:
מלח MessageDigest = MessageDigest.getInstance ("SHA-256"); salt.update (UUID.randomUUID (). toString (). getBytes ("UTF-8")); מחרוזת עיכול = bytesToHex (salt.digest ());
5. מסקנה
במאמר זה ראינו כיצד בנוי UUID, אילו גרסאות וגרסאות יש. למדנו לאילו גרסאות ג'אווה מספקת הטמעה מהקופסה, ובחנו דוגמאות קוד להפקת הגרסאות האחרות.
וכמו תמיד, קוד המקור ליישום זמין ב- Github.