מדריך ל- 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.


$config[zx-auto] not found$config[zx-overlay] not found