Μετάβαση στο περιεχόμενο

Δωρεάν Γεννήτρια UUID - Δημιουργία V1 & V4 UUID Άμεσα

Δημιουργήστε μοναδικά αναγνωριστικά άμεσα με τη δωρεάν γεννήτρια UUID. Δημιουργήστε Version 1 (χρονοβασισμένα) και Version 4 (τυχαία) UUID για βάσεις δεδομένων, API και κατανεμημένα συστήματα.

Γεννήτρια UUID

Έκδοση UUID
Παραγόμενο UUID
Υπολογιστής φόρτωσης...
📚

Τεκμηρίωση

Γεννήτρια UUID

Μια γεννήτρια UUID είναι ένα εργαλείο που δημιουργεί ένα καθολικά μοναδικό αναγνωριστικό, ή UUID: έναν κώδικα 128 bit που χρησιμοποιείται για την επισήμανση ενός τμήματος δεδομένων, ώστε κανένα άλλο στοιχείο, πουθενά, να μην έχει κατά πάσα πιθανότητα την ίδια ετικέτα. Αυτή η σελίδα δημιουργεί UUID έκδοσης 1 (με βάση τον χρόνο) και έκδοσης 4 (τυχαία).

Τι είναι ένα UUID;

Ένα UUID είναι ένας αριθμός 128 bit, γραμμένος ως 32 δεκαεξαδικά ψηφία (τους χαρακτήρες 0–9 και a-f). Χωρίζεται σε πέντε ομάδες που διαχωρίζονται με ενωτικά, σύμφωνα με το μοτίβο 8-4-4-4-12, με συνολικά 36 χαρακτήρες. Ένα UUID παραδείγματος έχει την εξής μορφή:

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

Τα UUID ορίζονται από το RFC 9562, που δημοσιεύτηκε από την Internet Engineering Task Force τον Μάιο του 2024 και αντικατέστησε το παλαιότερο RFC 4122 του 2005. Και τα δύο έγγραφα περιγράφουν την ίδια μορφή 128 bit. Το λογισμικό τα χρησιμοποιεί για την αναγνώριση γραμμών βάσεων δεδομένων, αρχείων, συνόδων χρηστών και άλλων εγγραφών, χωρίς να χρειάζεται μια κεντρική αρχή για την κατανομή αριθμών. Επειδή το σύνολο των πιθανών UUID είναι τόσο μεγάλο, δύο υπολογιστές μπορούν να δημιουργήσουν UUID ανεξάρτητα, την ίδια στιγμή, και σχεδόν ποτέ να μην παράγουν το ίδιο.

Μορφή και δομή UUID

Τα 128 bit ενός UUID χωρίζονται σε ονοματισμένα πεδία. Κάθε πεδίο καταλαμβάνει σταθερό αριθμό bit:

  • time_low - 32 bit
  • time_mid - 16 bit
  • time_hi_and_version - 16 bit
  • clock_seq_hi_and_reserved - 8 bit
  • clock_seq_low - 8 bit
  • node - 48 bit
Διάταξη πεδίων 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

Τέσσερα bit μέσα στο time_hi_and_version περιέχουν τον αριθμό έκδοσης του UUID και δύο bit μέσα στο clock_seq_hi_and_reserved περιέχουν την παραλλαγή, η οποία ενημερώνει το λογισμικό πώς να διαβάσει τα υπόλοιπα πεδία. Ορίζονται οκτώ εκδόσεις.

Τα παραπάνω ονόματα πεδίων προέρχονται από την έκδοση 1, όπου πράγματι περιέχουν μια τιμή χρόνου και μια τιμή κόμβου. Οι άλλες εκδόσεις διατηρούν την ίδια διάταξη 8-4-4-4-12 και τα ίδια όρια πεδίων, αλλά συμπληρώνουν τα περισσότερα bit με τυχαία δεδομένα. Σε ένα UUID έκδοσης 4, η ομάδα με την ετικέτα time_low είναι τυχαία και όχι χρονική.

Πώς να δημιουργήσετε ένα UUID με αυτό το εργαλείο

  1. Επιλέξτε έκδοση: έκδοση 1 (με βάση τον χρόνο) ή έκδοση 4 (τυχαία).
  2. Διαβάστε το UUID στο πλαίσιο αποτελέσματος. Ένα νέο UUID εμφανίζεται μόλις φορτωθεί η σελίδα ή αλλάξει η έκδοση.
  3. Επιλέξτε «Generate» για να δημιουργήσετε άλλο.
  4. Επιλέξτε «Copy» για να αντιγράψετε το αποτέλεσμα στο πρόχειρο και, στη συνέχεια, επικολλήστε το σε κώδικα, βάση δεδομένων ή αρχείο ρυθμίσεων.

Ο πίνακας κάτω από το αποτέλεσμα χωρίζει το UUID στα πέντε πεδία του και ονομάζει καθένα, ώστε το ψηφίο έκδοσης και το ψηφίο παραλλαγής να εντοπίζονται εύκολα.

Η έκδοση 4 είναι κατάλληλη για τις περισσότερες εργασίες, όπως κλειδιά βάσεων δεδομένων και διακριτικά συνόδων, επειδή δεν περιέχει πληροφορίες για το πότε ή πού δημιουργήθηκε. Η έκδοση 1 είναι κατάλληλη για εγγραφές των οποίων ο χρόνος δημιουργίας πρέπει να μπορεί να ανακτηθεί από το ίδιο το αναγνωριστικό, όπως οι καταχωρίσεις αρχείων καταγραφής.

UUID έκδοσης 1 έναντι έκδοσης 4

Η έκδοση 1 κωδικοποιεί την τρέχουσα χρονική σήμανση, καθώς και μια τυχαία ακολουθία ρολογιού και μια τιμή κόμβου. Το πρότυπο επιτρέπει η τιμή κόμβου να είναι η πραγματική διεύθυνση δικτύου (MAC) ενός υπολογιστή, αλλά επιτρέπει επίσης μια τυχαία τιμή κόμβου ως εναλλακτική που προστατεύει την ιδιωτικότητα. Αυτό το εργαλείο χρησιμοποιεί πάντα την τυχαία επιλογή: τα UUID έκδοσης 1 δεν διαβάζουν ούτε αποκαλύπτουν ποτέ μια πραγματική διεύθυνση MAC. Το πρότυπο απαιτεί επίσης το λιγότερο σημαντικό bit του πρώτου byte του πεδίου κόμβου να έχει την τιμή 1 για τυχαία τιμή κόμβου, και το εργαλείο το ρυθμίζει έτσι. Οι πραγματικές κάρτες δικτύου δεν έχουν ποτέ αυτό το bit ρυθμισμένο, επομένως ένας τυχαίος κόμβος δεν μπορεί να εκληφθεί ως πραγματικός. Γι’ αυτό το δεύτερο δεκαεξαδικό ψηφίο της πέμπτης ομάδας είναι πάντα περιττό σε UUID έκδοσης 1 από αυτή τη σελίδα: 1, 3, 5, 7, 9, b, d ή f.

Η χρονική σήμανση μέσα σε ένα UUID έκδοσης 1 μπορεί να αναγνωστεί, ώστε οι εγγραφές να ταξινομηθούν κατά σειρά δημιουργίας. Η ταξινόμηση του ίδιου του κειμένου UUID δεν το επιτυγχάνει, επειδή η πρώτη ομάδα περιέχει τα χαμηλότερα 32 bit της χρονικής σήμανσης, τα οποία επανέρχονται περίπου κάθε 7 λεπτά. Η έκδοση 6, που προστέθηκε στο RFC 9562, αποθηκεύει την ίδια χρονική σήμανση με τα υψηλότερα bit πρώτα, ώστε να λειτουργεί η ταξινόμηση απλού κειμένου.

Η έκδοση 4 δημιουργείται από τυχαία bit, με λίγα bit σταθερά για τη σήμανση της έκδοσης και της παραλλαγής. Δεν περιέχει χρονική σήμανση ή δεδομένα ειδικά για το μηχάνημα, επομένως δεν αποκαλύπτει πότε ή πού δημιουργήθηκε. Δεν μπορεί να ταξινομηθεί κατά σειρά δημιουργίας.

Έξι άλλες εκδόσεις υπάρχουν στο πρότυπο, αλλά δεν δημιουργούνται από αυτό το εργαλείο: η έκδοση 2 (DCE Security, σπάνια χρησιμοποιούμενη), οι εκδόσεις 3 και 5, που δημιουργούνται με κατακερματισμό ενός χώρου ονομάτων και ενός ονόματος με MD5 ή SHA-1, ώστε η ίδια είσοδος να παράγει πάντα το ίδιο UUID, και οι εκδόσεις 6, 7 και 8, που προστέθηκαν από το RFC 9562 το (24.300 cm) 2024 για ταξινομήσιμα και προσαρμοσμένα αναγνωριστικά.

Πώς υπολογίζεται ένα UUID (τύπος)

Έκδοση 4:

  1. Δημιουργήστε 128 τυχαία bit.
  2. Ρυθμίστε τα τέσσερα bit της έκδοσης, δηλαδή το πρώτο δεκαεξαδικό ψηφίο της τρίτης ομάδας, σε 0100 (δεκαεξαδικό 4).
  3. Ρυθμίστε τα δύο υψηλότερα bit της τέταρτης ομάδας σε 10 (ώστε το πρώτο δεκαεξαδικό ψηφίο αυτής της ομάδας να είναι 8, 9, a ή b).

Μόνο 122 από τα 128 bit είναι πραγματικά τυχαία, επειδή 6 bit καθορίζονται από τα βήματα 2 και 3. Αυτό δίνει 2^122, δηλαδή περίπου 5,3 × 10^36, πιθανά UUID έκδοσης 4.

Έκδοση 1:

  1. Λάβετε την τρέχουσα ώρα ως πλήθος διαστημάτων 100 νανοδευτερολέπτων από την 15 Οκτωβρίου 1582, ημερομηνία της μεταρρύθμισης του Γρηγοριανού ημερολογίου. Στην πράξη, αυτό είναι ο συνηθισμένος χρόνος Unix σε χιλιοστά του δευτερολέπτου συν 12.219.292.800.000, με το σύνολο πολλαπλασιασμένο επί 10.000.
  2. Χωρίστε αυτό το πλήθος των 60 bit σε τρία πεδία: τα χαμηλότερα 32 bit τοποθετούνται στο time_low, τα επόμενα 16 στο time_mid και τα υψηλότερα 12 στο time_hi_and_version.
  3. Δημιουργήστε μια ακολουθία ρολογιού 14 bit, που χρησιμοποιείται για την αποφυγή συγκρούσεων αν το ρολόι του συστήματος ρυθμιστεί προς τα πίσω.
  4. Δημιουργήστε μια τιμή κόμβου 48 bit, με το λιγότερο σημαντικό bit του πρώτου byte της ρυθμισμένο σε 1.
  5. Ρυθμίστε τα bit της έκδοσης σε 0001 και τα bit της παραλλαγής σε 10.

Σε όλες τις εκδόσεις UUID, ο πλήρης χώρος 128 bit περιέχει 2^128, δηλαδή περίπου 3,4 × 10^38, πιθανές τιμές. Το πλήθος είναι τόσο μεγάλο, ώστε οι τυχαίες συγκρούσεις να μην αποτελούν πρακτικό ζήτημα.

Λυμένο παράδειγμα

Ανάγνωση UUID έκδοσης 4. Πάρτε το προηγούμενο παράδειγμα: 550e8400-e29b-41d4-a716-446655440000.

  • Τρίτη ομάδα, 41d4: το πρώτο ψηφίο είναι 4, που δηλώνει ότι πρόκειται για UUID έκδοσης 4.
  • Τέταρτη ομάδα, a716: το πρώτο ψηφίο, a (δυαδικό 1010), αρχίζει με 10, τα απαιτούμενα bit παραλλαγής.
  • Τα υπόλοιπα δεκαεξαδικά ψηφία είναι το τυχαίο φορτίο.

Ένα πρόγραμμα που διαβάζει αυτό το 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 ms.
  2. Πολλαπλασιάστε επί 10.000 για να λάβετε διαστήματα 100 νανοδευτερολέπτων: 139,192,928,000,000,000. Σε δεκαεξαδική μορφή αυτό είναι 01EE833B04AFC000.
  3. Τεμαχίστε το: time_low = 04AFC000 (τα χαμηλότερα 8 δεκαεξαδικά ψηφία), time_mid = 833B (τα επόμενα 4) και τα υψηλότερα 12 bit είναι 1EE.
  4. Τοποθετήστε το ψηφίο έκδοσης 1 μπροστά από το 1EE, ώστε να προκύψει time_hi_and_version = 11EE.

Το UUID είναι τότε 04afc000-833b-11ee- ακολουθούμενο από την ακολουθία ρολογιού και την τιμή κόμβου. Το λογισμικό μπορεί να αντιστρέψει αυτά τα τέσσερα βήματα για να ανακτήσει την 14 Νοεμβρίου 2023 από το αναγνωριστικό.

Συνήθεις χρήσεις των UUID

  • Πρωτεύοντα κλειδιά σε βάσεις δεδομένων, ιδιαίτερα όταν πολλοί διακομιστές δημιουργούν εγγραφές ταυτόχρονα χωρίς να συνεννοούνται μεταξύ τους.
  • Διακριτικά συνόδων και κλειδιά API, συνήθως έκδοσης 4 για την ιδιωτικότητα που παρέχουν.
  • Αναγνωριστικά αρχείων, συμβάντων και πόρων σε κατανεμημένα συστήματα, όπως οι μικροϋπηρεσίες.
  • Αναγνωριστικά συσκευών σε μεγάλα δίκτυα IoT, όπου κάθε συσκευή μπορεί να δημιουργεί το δικό της αναγνωριστικό εκτός σύνδεσης.

Το βασικό μειονέκτημα είναι το μέγεθος: ένα UUID απαιτεί 16 byte αποθήκευσης, έναντι 4 ή 8 byte για έναν απλό μετρητή ακεραίων, και ορισμένες βάσεις δεδομένων δημιουργούν ευρετήρια για UUID πιο αργά από ό,τι για διαδοχικούς ακεραίους.

Εναλλακτικές λύσεις αντί των UUID

Οι ακέραιοι με αυτόματη αύξηση είναι μικρότεροι και απλούστεροι, αλλά δεν λειτουργούν καλά όταν περισσότεροι από ένας διακομιστές πρέπει να εκχωρούν αναγνωριστικά ανεξάρτητα. Τα αναγνωριστικά Snowflake, που αναπτύχθηκαν στο Twitter, συνδυάζουν μια χρονική σήμανση με ένα αναγνωριστικό κόμβου εργασίας για να παράγουν συμπαγή, ταξινομήσιμα αναγνωριστικά σε κατανεμημένο σύστημα. Τα ULID (καθολικά μοναδικά λεξικογραφικά ταξινομήσιμα αναγνωριστικά) είναι μια νεότερη μορφή, σχεδιασμένη να είναι ταυτόχρονα τυχαία και ταξινομήσιμη κατά χρόνο δημιουργίας, σε αντίθεση με ένα τυπικό UUID έκδοσης 4.

Ιστορικό του προτύπου UUID

Η έννοια του UUID ξεκίνησε τη δεκαετία του 1980 στην Apollo Computer, ως μέρος του Network Computing System. Αργότερα, το Open Software Foundation υιοθέτησε τη μορφή για το Distributed Computing Environment. Η Internet Engineering Task Force δημοσίευσε το RFC 4122 το (10.500 cm) 2005 και το αντικατέστησε με το RFC 9562 τον Μάιο του 2024. Το RFC 9562 διατηρεί όλες τις προηγούμενες εκδόσεις σε λειτουργία χωρίς αλλαγές και προσθέτει τις εκδόσεις 6, 7 και 8.

Συχνές ερωτήσεις

Σε τι χρησιμοποιείται μια γεννήτρια UUID; Δημιουργεί μοναδικά αναγνωριστικά για βάσεις δεδομένων, κατανεμημένα συστήματα, διακριτικά συνόδων, κλειδιά API και αναγνωριστικά συσκευών, ώστε καμία δύο εγγραφές να μην χρειάζεται να μοιράζονται το ίδιο αναγνωριστικό.

Ποια είναι η διαφορά μεταξύ UUID v1 και v4; Η έκδοση 1 κωδικοποιεί μια χρονική σήμανση, την οποία το λογισμικό μπορεί να διαβάσει για να ανακτήσει τον χρόνο δημιουργίας. Η έκδοση 4 είναι πλήρως τυχαία και δεν περιέχει χρονική σήμανση. Η έξοδος έκδοσης 1 αυτού του εργαλείου χρησιμοποιεί μια τυχαία τιμή κόμβου αντί για πραγματική διεύθυνση MAC, επομένως δεν αποκαλύπτει ούτε πληροφορίες που ταυτοποιούν το μηχάνημα.

Αποκαλύπτει η έκδοση 1 τη διεύθυνση MAC μου; Όχι με αυτό το εργαλείο. Το πρότυπο επιτρέπει στο πεδίο κόμβου ενός UUID έκδοσης 1 να περιέχει πραγματική διεύθυνση MAC, αλλά αυτή η γεννήτρια συμπληρώνει πάντα το πεδίο με τυχαία bit και ρυθμίζει το bit που δηλώνει ότι η τιμή δεν είναι πραγματική διεύθυνση δικτύου.

Είναι εγγυημένο ότι τα UUID είναι μοναδικά; Κανένα σχήμα αναγνωριστικών δεν μπορεί να εγγυηθεί απόλυτη μοναδικότητα, αλλά ο χώρος 128 bit περιέχει περίπου 3,4 × 10^38 πιθανές τιμές και ένα UUID έκδοσης 4 έχει περίπου 5,3 × 10^36 πιθανές τυχαίες τιμές. Η πιθανότητα διπλότυπου είναι αρκετά μικρή ώστε να αγνοείται σχεδόν σε κάθε πρακτική χρήση.

Μπορώ να χρησιμοποιήσω ένα UUID ως πρωτεύον κλειδί βάσης δεδομένων; Ναι. Τα UUID λειτουργούν καλά ως πρωτεύοντα κλειδιά σε κατανεμημένα συστήματα, επειδή κάθε κόμβος μπορεί να δημιουργήσει ένα χωρίς να συνεννοηθεί με κεντρικό διακομιστή. Το κόστος είναι 16 byte αποθήκευσης ανά κλειδί, περισσότερα από έναν τυπικό ακέραιο, και ενδεχομένως χαμηλότερη απόδοση ευρετηρίου σε πολύ μεγάλους πίνακες.

Είναι ένα UUID το ίδιο με ένα GUID; Ναι. Το GUID (καθολικά μοναδικό αναγνωριστικό) είναι η ονομασία της Microsoft για την ίδια έννοια που ορίζεται από το RFC 4122 ως UUID.

Μπορούν τα UUID έκδοσης 4 να ταξινομηθούν κατά χρόνο δημιουργίας; Όχι. Τα UUID έκδοσης 4 είναι τυχαία, επομένως δεν περιέχουν πληροφορίες για το πότε δημιουργήθηκαν. Ένα UUID έκδοσης 1 περιέχει τέτοια πληροφορία, αλλά πρέπει πρώτα να αποκωδικοποιηθεί· η ταξινόμηση του κειμένου δεν δίνει τη σειρά δημιουργίας. Οι εκδόσεις 6, 7 και τα ULID έχουν σχεδιαστεί ώστε να ταξινομούνται απευθείας ως κείμενο.

Παραπομπές

  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