UUID v4 vs v7: ποιο μοναδικό αναγνωριστικό να επιλέξετε;

Ένα UUID είναι ένα μοναδικό αναγνωριστικό 128 bit χωρίς κεντρικό συντονισμό. Η έκδοση 4, εντελώς τυχαία, κυριαρχεί εδώ και χρόνια. Η έκδοση 7, πιο πρόσφατη (RFC 9562, 2024), ενσωματώνει μια χρονοσήμανση στην αρχή για να παράγει χρονικά ταξινομημένα αναγνωριστικά. Αυτή η διαφορά, φαινομενικά ασήμαντη, αλλάζει ριζικά τις επιδόσεις στη βάση δεδομένων. Δείτε ποιο να επιλέξετε.

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

Ένα UUID (Universally Unique Identifier) είναι ένας αριθμός 128 bit που αναπαρίσταται με 32 δεκαεξαδικούς χαρακτήρες ομαδοποιημένους σε πέντε μπλοκ, για παράδειγμα 550e8400-e29b-41d4-a716-446655440000. Ο λόγος ύπαρξής του: η παραγωγή ενός μοναδικού αναγνωριστικού χωρίς να ζητηθεί από μια κεντρική αρχή, γεγονός που το καθιστά ιδανικό για κατανεμημένα συστήματα. Μπορείτε να παράγετε με τη γεννήτρια UUID μας.

Υπάρχουν πολλές εκδόσεις: οι πιο σχετικές σήμερα για κλειδιά εγγραφών είναι η v4 (τυχαία) και η v7 (χρονικά ταξινομημένη).

UUID v4 (τυχαίο)

Το UUID v4 αποτελείται από 122 τυχαία bit (τα υπόλοιπα κωδικοποιούν την έκδοση και τη variant). Η πιθανότητα σύγκρουσης είναι τόσο χαμηλή που είναι αμελητέα στην πράξη. Είναι η εξ ορισμού έκδοση στις περισσότερες γλώσσες και βιβλιοθήκες.

  • Απρόβλεπτο: ιδανικό για διακριτικά ή δημόσια αναγνωριστικά που δεν θέλουμε να μαντεύονται
  • Καμία διαρροή πληροφορίας: δεν αποκαλύπτει ούτε ημερομηνία ούτε σειρά δημιουργίας
  • Μειονέκτημα: εντελώς αταξινόμητο, γεγονός που ταλαιπωρεί τα ευρετήρια βάσης δεδομένων

UUID v7 (χρονικά ταξινομημένο)

Το UUID v7 τοποθετεί μια χρονοσήμανση Unix σε χιλιοστά του δευτερολέπτου στα πρώτα 48 bit του, ακολουθούμενη από τυχαία bit. Δύο UUID v7 που παράγονται σε διαφορετικές στιγμές ταξινομούνται έτσι με τη σειρά δημιουργίας τους, παραμένοντας μοναδικά και πρακτικά αδύνατο να μαντευτούν.

  • Ταξινομήσιμο: η λεξικογραφική σειρά αντιστοιχεί στη χρονολογική σειρά
  • Φιλικό προς τα ευρετήρια: οι εισαγωγές γίνονται στο τέλος του ευρετηρίου, όπως ένα auto-increment
  • Αντιστάθμισμα: αποκαλύπτει τη στιγμή δημιουργίας, γεγονός που μπορεί να είναι ανεπιθύμητο για ένα δημόσιο αναγνωριστικό

Συγκριτικός πίνακας

Κριτήριο UUID v4 UUID v7
Σύνθεση122 τυχαία bitΧρονοσήμανση + τυχαίο
Χρονικά ταξινομημένοΌχιΝαι
ΤαξινομήσιμοΌχιΝαι (χρονολογικά)
Επιδόσεις ευρετηρίουΧαμηλές (κατακερματισμός)Υψηλές (διαδοχικές εισαγωγές)
ΑπροβλεπτότηταΠλήρηςΥψηλή αλλά αποκαλύπτει τη στιγμή
Διαρροή πληροφορίαςΚαμίαΗμερομηνία δημιουργίας
Ωριμότητα / υποστήριξηΚαθολικήΠρόσφατη (RFC 9562, 2024)

Επίδραση στις βάσεις δεδομένων

Αυτή είναι η καρδιά του θέματος. Οι σχεσιακές βάσεις αποθηκεύουν τα ευρετήριά τους σε δέντρα B (B-tree). Η εισαγωγή τυχαίων κλειδιών (v4) διασκορπίζει τις εγγραφές παντού στο ευρετήριο, προκαλώντας κατακερματισμό, διασπάσεις σελίδων και λιγότερο αποδοτική cache. Σε μεγάλους όγκους, οι επιδόσεις εισαγωγής υποβαθμίζονται αισθητά.

Τα ταξινομημένα κλειδιά (v7) εισάγονται πάντα στο τέλος του ευρετηρίου, όπως ένα αυτο-αυξανόμενο αναγνωριστικό. Ανακτούμε γρήγορες εισαγωγές, καλύτερη τοπικότητα και ένα πιο συμπαγές ευρετήριο. Αυτό είναι ιδιαίτερα εμφανές με ένα πρωτεύον κλειδί σε InnoDB (MySQL), όπου το πρωτεύον κλειδί καθορίζει τη φυσική σειρά των γραμμών.

Πότε να επιλέξετε το ένα ή το άλλο

Επιλέξτε το UUID v4 όταν

  • Το αναγνωριστικό εκτίθεται δημόσια και δεν πρέπει να αποκαλύπτει τίποτα
  • Παράγετε διακριτικά, συνδέσμους κοινής χρήσης, μυστικά
  • Η σειρά και η ημερομηνία δημιουργίας δεν πρέπει να μαντεύονται
  • Θέλετε μέγιστη συμβατότητα με το υπάρχον

Επιλέξτε το UUID v7 όταν

  • Το UUID χρησιμεύει ως πρωτεύον κλειδί σε μια βάση δεδομένων
  • Ο όγκος εισαγωγών είναι υψηλός και οι επιδόσεις ευρετηρίου μετράνε
  • Θέλετε να ταξινομείτε κατά σειρά δημιουργίας χωρίς ειδική στήλη
  • Η αποκάλυψη της στιγμής δημιουργίας δεν αποτελεί πρόβλημα

Σύσταση

Για ένα πρωτεύον κλειδί βάσης δεδομένων, προτιμήστε πλέον το UUID v7: διατηρείτε την κατανεμημένη μοναδικότητα του UUID αποφεύγοντας παράλληλα την επιβάρυνση του ευρετηρίου της v4. Διατηρήστε το UUID v4 για δημόσια αναγνωριστικά, διακριτικά και μυστικά, όπου η πλήρης απροβλεπτότητα και η απουσία χρονικής διαρροής υπερισχύουν.

Ελέγξτε ωστόσο την υποστήριξη της v7 στη γλώσσα σας και στο ORM σας: η RFC είναι πρόσφατη, αλλά η υιοθέτηση προχωρά γρήγορα.

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

Είναι το UUID v7 λιγότερο ασφαλές από το v4;

Παραμένει πολύ δύσκολο να μαντευτεί χάρη στα τυχαία bit του, αλλά αποκαλύπτει τη στιγμή δημιουργίας μέσω της χρονοσήμανσής του. Για ένα δημόσιο αναγνωριστικό όπου η ημερομηνία δεν πρέπει να διαρρεύσει, ή ένα μυστικό, προτιμήστε τη v4.

Γιατί το UUID v4 επιβραδύνει τις βάσεις δεδομένων;

Επειδή οι τυχαίες τιμές του διασκορπίζουν τις εισαγωγές σε όλο το ευρετήριο B-tree, γεγονός που κατακερματίζει τις σελίδες και μειώνει την αποδοτικότητα της cache. Η v7, ταξινομημένη, εισάγει στο τέλος του ευρετηρίου και αποφεύγει αυτό το πρόβλημα.

Μπορώ να μεταβώ από v4 σε v7;

Ναι για τις νέες εγγραφές: τα δύο format συνυπάρχουν στην ίδια στήλη UUID. Δεν χρειάζεται να ξαναγράψετε το ιστορικό: απλώς μεταβείτε στην παραγωγή των νέων κλειδιών προς τη v7.

Τι ισχύει για τις εκδόσεις v1 και v6;

Η v1 κωδικοποιεί τη χρονοσήμανση και τη διεύθυνση MAC, γεγονός που δημιουργεί ζητήματα εμπιστευτικότητας. Η v6 αναδιατάσσει τη v1 για να την καταστήσει ταξινομήσιμη. Για ένα νέο έργο, η v7 είναι η ταξινομημένη έκδοση που συνιστάται από την RFC 9562.