Γεννήτρια UUID
Τι είναι το UUID;
Το UUID (Universally Unique Identifier) είναι ένα αναγνωριστικό 128-bit που χρησιμοποιείται σε συστήματα υπολογιστών για τη μοναδική αναγνώριση πληροφοριών. Το UUID είναι τυποποιημένο σύμφωνα με το RFC 4122 και χάρη στην τεράστια εντροπία του, εγγυάται πρακτικά μηδενική πιθανότητα σύγκρουσης – αυτό σημαίνει ότι δύο ανεξάρτητα δημιουργημένα UUID θα είναι σχεδόν σίγουρα μοναδικά.
Το UUID έχει μια τυπική μορφή: xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx, όπου κάθε x είναι ένα δεκαεξαδικό ψηφίο (0-9, a-f), το M υποδεικνύει την έκδοση του UUID και το N υποδεικνύει την παραλλαγή.
Εκδόσεις UUID
UUID v1 (Χρονική σήμανση + διεύθυνση MAC)
Το UUID v1 βασίζεται σε μια τρέχουσα χρονική σήμανση (timestamp) και μια τυχαία τιμή (στο πρόγραμμα περιήγησης αντί για διεύθυνση MAC). Χρησιμοποιεί διαστήματα 100 νανοδευτερολέπτων από τις 15 Οκτωβρίου 1582 (Γρηγοριανό ημερολόγιο).
Χρήση:
- Περιπτώσεις όπου χρειάζεστε χρονολογική ταξινόμηση των UUID
- Εντοπισμός σφαλμάτων και καταγραφή (το UUID περιέχει πληροφορίες για τον χρόνο δημιουργίας)
- Κατανεμημένα συστήματα με χρονικό συγχρονισμό
Παράδειγμα: 6ba7b810-9dad-11d1-80b4-00c04fd430c8
Πλεονεκτήματα:
- Τα UUID μπορούν να ταξινομηθούν χρονολογικά ανάλογα με τον χρόνο δημιουργίας
- Χρήσιμο για έλεγχο και εντοπισμό σφαλμάτων
- Περιέχει πληροφορίες χρονικής σήμανσης
Μειονεκτήματα:
- Πιθανός κίνδυνος ασφαλείας – περιέχει χρονική σήμανση
- Στο πρόγραμμα περιήγησης δεν περιέχει την πραγματική διεύθυνση MAC (αντικαθίσταται από τυχαία τιμή)
- Κακή τοπικότητα βάσης δεδομένων (η χρονική σήμανση βρίσκεται στα low-order bits)
UUID v3 (MD5 κατακερματισμός)
Το UUID v3 δημιουργείται χρησιμοποιώντας MD5 κατακερματισμό του χώρου ονομάτων UUID και του ονόματος. Είναι ντετερμινιστικό – ο ίδιος χώρος ονομάτων + όνομα θα δημιουργεί πάντα το ίδιο UUID.
Χρήση:
- Μετατροπή URL, ονομάτων DNS ή άλλων αναγνωριστικών σε UUID
- Περιπτώσεις όπου χρειάζεστε αναπαραγώγιμα UUID
- Αντιστοίχιση μεταξύ διαφορετικών συστημάτων αναγνώρισης
Παράδειγμα: a3bb189e-8bf9-3888-9912-ace4e6543002
Πλεονεκτήματα:
- Ντετερμινιστικό (ίδια είσοδος = ίδια έξοδος)
- Ιδανικό για μετατροπές γνωστών αναγνωριστικών
- Καμία σύγκρουση για διαφορετικές εισόδους
Μειονεκτήματα:
- Το MD5 είναι ένας παλιός αλγόριθμος (προτιμήστε το v5)
- Απαιτεί χώρο ονομάτων και όνομα
- Δεν μπορεί να ανακτήσει την αρχική είσοδο
UUID v4 (Τυχαίο) - ΣΥΝΙΣΤΑΤΑΙ
Η πιο συχνά χρησιμοποιούμενη έκδοση UUID. Το UUID v4 δημιουργείται καθαρά τυχαία χρησιμοποιώντας έναν κρυπτογραφικά ασφαλή γεννήτορα τυχαίων αριθμών (crypto.getRandomValues()).
Χρήση:
- Πρωτεύοντα κλειδιά βάσης δεδομένων
- Αναγνωριστικά συνεδριών (session IDs)
- Μοναδικά ονόματα αρχείων
- Token API
- Γενικοί σκοποί όπου χρειάζεστε εγγυημένα μοναδικό ID
Παράδειγμα: f47ac10b-58cc-4372-a567-0e02b2c3d479
Πλεονεκτήματα:
- Μέγιστη εντροπία και ασφάλεια
- Καμία εξάρτηση από χρόνο ή παραμέτρους συστήματος
- Η απλούστερη υλοποίηση
Πιθανότητα σύγκρουσης: Κατά τη δημιουργία 1 δισεκατομμυρίου UUID ανά δευτερόλεπτο για 100 χρόνια, η πιθανότητα σύγκρουσης είναι περίπου 0,00000006%.
UUID v5 (SHA-1 κατακερματισμός)
Το UUID v5 είναι το ίδιο με το v3, αλλά χρησιμοποιεί SHA-1 αντί για MD5. Μια πιο σύγχρονη και ασφαλέστερη εναλλακτική λύση του v3.
Χρήση:
- Όμοια με το v3, αλλά με καλύτερη ασφάλεια
- Προτιμάται από το v3 για νέα έργα
- Δημιουργία UUID από URL, ονόματα DNS, OID, X.500 DN
Παράδειγμα: 886313e1-3b8a-5372-9b90-0c9aee199e5d
Πλεονεκτήματα:
- Ντετερμινιστικό
- Το SHA-1 είναι πιο ισχυρό από το MD5
- Κατάλληλο για αντιστοίχιση μεταξύ συστημάτων
Μειονεκτήματα:
- Το SHA-1 θεωρείται επίσης παλιό (αλλά ακόμα ασφαλέστερο από το MD5)
- Απαιτεί χώρο ονομάτων και όνομα
UUID v6 (Ταξινομημένη χρονική σήμανση)
Το UUID v6 είναι μια βελτιωμένη έκδοση του v1 με αναδιατεταγμένα χρονικά bits για καλύτερη ευρετηρίαση βάσης δεδομένων. Σχεδιάστηκε για να επιλύσει προβλήματα τοπικότητας στις βάσεις δεδομένων.
Χρήση:
- Πρωτεύοντα κλειδιά βάσης δεδομένων με χρονολογική ταξινόμηση
- Συστήματα που απαιτούν χρονολογική ταξινόμηση και απόδοση βάσης δεδομένων
- Μια πιο σύγχρονη εναλλακτική λύση του v1
Παράδειγμα: 1ec9414c-232a-6b00-b3c8-9e6bdeced846
Πλεονεκτήματα:
- Καλύτερη τοπικότητα βάσης δεδομένων από το v1 (χρονική σήμανση στα high-order bits)
- Χρονολογική ταξινόμηση
- Συμβατό με το πρότυπο UUID
Μειονεκτήματα:
- Λιγότερο χρησιμοποιούμενο από τα v1/v4
- Περιέχει ακόμα πληροφορίες χρόνου (κίνδυνος ασφαλείας)
UUID v7 (Χρονική σήμανση Unix)
Το UUID v7 χρησιμοποιεί χρονική σήμανση Unix (χιλιοστά του δευτερολέπτου από το 1970) + τυχαία bits. Η νεότερη έκδοση UUID με την καλύτερη τοπικότητα βάσης δεδομένων.
Χρήση:
- Σύγχρονα πρωτεύοντα κλειδιά βάσης δεδομένων
- Συστήματα που απαιτούν απόδοση + χρονολογική ταξινόμηση
- Αντικατάσταση των v1/v6 σε νέα έργα
Παράδειγμα: 017f22e2-79b0-7cc3-98c4-dc0c0c07398f
Πλεονεκτήματα:
- Η καλύτερη τοπικότητα βάσης δεδομένων από όλες τις εκδόσεις
- Η χρονική σήμανση Unix είναι τυπική
- Συνδυάζει τα πλεονεκτήματα της τυχαιότητας και της χρονολογικής ταξινόμησης
Μειονεκτήματα:
- Σχετικά νέα προδιαγραφή (RFC 4122bis)
- Λιγότερο υποστηριζόμενο σε παλαιότερα συστήματα
Ποια έκδοση UUID να χρησιμοποιήσετε;
Οδηγός απόφασης
Χρειάζεστε μέγιστη ασφάλεια και τυχαιότητα; → Χρησιμοποιήστε UUID v4 (η πιο κοινή επιλογή)
Χρειάζεστε χρονολογική ταξινόμηση και απόδοση βάσης δεδομένων; → Χρησιμοποιήστε UUID v7 (μοντέρνο) ή UUID v6 (πρότυπο)
Χρειάζεστε αναπαραγώγιμα UUID από υπάρχοντα αναγνωριστικά; → Χρησιμοποιήστε UUID v5 (SHA-1) ή UUID v3 (MD5, παλαιό)
Χρειάζεστε χρονική σήμανση και ιστορικό ελέγχου (audit trail); → Χρησιμοποιήστε UUID v1 (παλαιό, χειρότερη απόδοση βάσης δεδομένων)
Βάσεις δεδομένων
Για νέα έργα: UUID v7 ή v4
- Το v7 είναι ιδανικό για χρονολογική ταξινόμηση + απόδοση
- Το v4 για μέγιστη τυχαιότητα χωρίς πληροφορίες χρόνου
Για παλαιότερα συστήματα: UUID v1 ή v6
- Το v6 έχει καλύτερη τοπικότητα βάσης δεδομένων από το v1
- Το v1 υποστηρίζεται ευρέως
Πλεονεκτήματα των UUID ως πρωτεύοντα κλειδιά:
- Παγκόσμια μοναδικότητα – Μπορείτε να συνδέσετε δεδομένα από διαφορετικές βάσεις δεδομένων χωρίς σύγκρουση
- Ασφάλεια – Σε αντίθεση με τα διαδοχικά αναγνωριστικά (1, 2, 3…), δεν μπορούν να μαντευτούν οι επόμενες τιμές
- Κατανεμημένα συστήματα – Τα UUID μπορούν να δημιουργηθούν ανεξάρτητα σε πολλούς διακομιστές χωρίς συντονισμό
- Συγχώνευση βάσεων δεδομένων – Κατά τη συγχώνευση δύο βάσεων δεδομένων δεν προκύπτουν συγκρούσεις
Μειονεκτήματα:
- Μεγαλύτερο μέγεθος (16 bytes έναντι 4-8 bytes για ακέραιο)
- Πιο αργή ευρετηρίαση σε ορισμένες βάσεις δεδομένων (χρησιμοποιήστε v6/v7 για καλύτερη απόδοση)
- Λιγότερο ευανάγνωστο για τον άνθρωπο
API και υπηρεσίες ιστού
- REST API – Μοναδικά αναγνωριστικά για πόρους
- GraphQL – Παγκόσμια αναγνωριστικά για κόμβους
- Webhooks – Παρακολούθηση αιτημάτων και απαντήσεων
- Tokens – Αναγνωριστικά συνεδριών (Session IDs), tokens ανανέωσης
Αρχεία και αποθήκευση
- Ονόματα αρχείων – Πρόληψη συγκρούσεων κατά τη μεταφόρτωση
- S3/Cloud Storage – Μοναδικές διαδρομές προς αντικείμενα
- Cache keys – Αναγνωριστικά σε συστήματα κρυφής μνήμης
Εφαρμογές frontend
- Συστατικά React/Vue – Μοναδικά κλειδιά για λίστες
- Προσωρινά IDs – IDs πριν την αποθήκευση στη βάση δεδομένων
- Local storage – Κλειδιά για αποθηκευμένα δεδομένα
- Εφαρμογές offline-first – Δημιουργία IDs χωρίς σύνδεση στον διακομιστή
Προηγμένες λειτουργίες της γεννήτριας
Δημιουργία UUID με προσαρμοσμένο χρόνο
Για εκδόσεις που βασίζονται στο χρόνο (v1, v6, v7), μπορείτε να επιλέξετε οποιαδήποτε χρονική σήμανση χρησιμοποιώντας τον επιλογέα ημερομηνίας-ώρας. Αυτό είναι χρήσιμο για:
Δοκιμές:
- Προσομοίωση UUID που δημιουργήθηκαν στο παρελθόν
- Δοκιμή χρονολογικής ταξινόμησης σε βάσεις δεδομένων
- Αναπαραγωγή UUID για εντοπισμό σφαλμάτων
Μετανάστευση δεδομένων:
- Δημιουργία UUID με ιστορικές χρονικές σημάνσεις
- Συμπλήρωση δεδομένων με σωστές τιμές χρονικής σήμανσης
- Εισαγωγή δεδομένων από διαφορετικές χρονικές περιόδους
Έλεγχος και συμμόρφωση:
- Ανακατασκευή UUID βάσει του χρόνου δημιουργίας της εγγραφής
- Αναδρομική δημιουργία αναγνωριστικών
Παράδειγμα χρήσης:
- Επιλέξτε έκδοση v1, v6 ή v7
- Ρυθμίστε την ημερομηνία και ώρα χρησιμοποιώντας τον επιλογέα ημερομηνίας-ώρας
- Δημιουργήστε UUID με τη δική σας χρονική σήμανση
UUID βασισμένο σε κατακερματισμό (v3, v5)
Για ντετερμινιστικά UUID, μπορείτε να χρησιμοποιήσετε τις εκδόσεις v3 (MD5) ή v5 (SHA-1):
Πώς να χρησιμοποιήσετε:
- Επιλέξτε το χώρο ονομάτων ανάλογα με τον τύπο του αναγνωριστικού σας
- Εισαγάγετε το όνομα/την τιμή
- Δημιουργήστε το UUID
Παραδείγματα:
| Χώρος ονομάτων | Όνομα (είσοδος) | Χρήση |
|---|---|---|
| DNS | example.com | Μετατροπή ονόματος τομέα σε UUID |
| DNS | google.com | Κάθε ιστότοπος έχει μοναδικό UUID |
| URL | https://example.com/page | Μετατροπή URL σε UUID |
| URL | https://api.example.com/users/123 | Τελικό σημείο API ως UUID |
| OID | 1.3.6.1.4.1.343 | Αναγνωριστικό αντικειμένου σε UUID |
| X.500 | CN=John Doe,O=Company | Αναγνωριστικό όνομα σε UUID |
Σημαντικά χαρακτηριστικά:
- ✅ Ντετερμινιστικό: Ίδια είσοδος = πάντα το ίδιο UUID
- ✅ Αναπαραγώγιμο: Μπορείτε να αναδημιουργήσετε το UUID ανά πάσα στιγμή
- ✅ Συνεπές: Το ίδιο UUID σε διαφορετικά συστήματα
- ❌ Δεν μπορεί να αποκωδικοποιηθεί: Από το UUID δεν μπορείτε να ανακτήσετε το αρχικό όνομα
- ℹ️ Ένα UUID: Για v3/v5 δημιουργείται πάντα μόνο ένα UUID (ίδια είσοδος = ίδια έξοδος)
Πρακτική χρήση:
// Παράδειγμα: Μετατροπή URL σε UUID v5
Namespace: URL
Name: https://example.com/api/users/123
Result: 886313e1-3b8a-5372-9b90-0c9aee199e5d
// Ίδια είσοδος = πάντα το ίδιο UUID
Namespace: DNS
Name: google.com
Result: always the same UUID for google.com
Πώς να χρησιμοποιήσετε τα UUID με ασφάλεια;
Κρυπτογραφική ασφάλεια
Η γεννήτορα μας χρησιμοποιεί το crypto.getRandomValues(), το οποίο είναι ένας κρυπτογραφικά ασφαλής γεννήτορας τυχαίων αριθμών. Σε αντίθεση με το Math.random(), το οποίο είναι προβλέψιμο και ακατάλληλο για σκοπούς ασφαλείας, το crypto.getRandomValues() παρέχει πραγματική εντροπία κατάλληλη για:
- Δημιουργία tokens ασφαλείας
- Αναγνωριστικά συνεδριών (Session IDs)
- Κλειδιά API
- Κρυπτογραφικές εφαρμογές
Σύγκριση εκδόσεων UUID
| Έκδοση | Βάση | Σύγκρουση | Χρονολογική ταξινόμηση | Απόδοση DB | Χρήση |
|---|---|---|---|---|---|
| v1 | Χρονική σήμανση + MAC | Χαμηλή | ✅ Ναι | ❌ Χειρότερη | Παλαιό, έλεγχος |
| v3 | MD5 κατακερματισμός | Καμία (ντετερμινιστικό) | ❌ Όχι | ⚠️ Μέτρια | Μετατροπές (παλαιό) |
| v4 | Τυχαίο | Εξαιρετικά χαμηλή | ❌ Όχι | ⚠️ Μέτρια | Γενική χρήση |
| v5 | SHA-1 κατακερματισμός | Καμία (ντετερμινιστικό) | ❌ Όχι | ⚠️ Μέτρια | Μετατροπές (προτεινόμενο) |
| v6 | Ταξινομημένη χρονική σήμανση | Χαμηλή | ✅ Ναι | ✅ Καλύτερη | Σύγχρονες DB με χρόνο |
| v7 | Χρονική σήμανση Unix | Χαμηλή | ✅ Ναι | ✅ Καλύτερη | Νέα έργα |
UUID έναντι άλλων αναγνωριστικών
| Τύπος | Μέγεθος | Σύγκρουση | Χρονολογική ταξινόμηση | Χρήση |
|---|---|---|---|---|
| Αναγνωριστικό αυτόματης αύξησης | 4-8 bytes | Εγγυημένα μοναδικό εντός πίνακα | ❌ | Απλές εφαρμογές, τοπική DB |
| UUID v4 | 16 bytes | Πρακτικά αδύνατο | ❌ | Κατανεμημένα συστήματα, API |
| UUID v7 | 16 bytes | Πρακτικά αδύνατο | ✅ | Σύγχρονες DB με απόδοση |
| ULID | 16 bytes | Πρακτικά αδύνατο | ✅ | UUID + λεξικογραφική ταξινόμηση |
| Snowflake ID | 8 bytes | Εγγυημένα μοναδικό με σωστή ρύθμιση | ✅ | Twitter, κατανεμημένα συστήματα |
| NanoID | Προσαρμόσιμο | Εξαρτάται από το μήκος | ❌ | Αναγνωριστικά φιλικά προς URL |
Υλοποίηση σε διαφορετικές γλώσσες
JavaScript/TypeScript
// UUID v4 - Ο απλούστερος τρόπος (σύγχρονα προγράμματα περιήγησης)
const uuid = crypto.randomUUID();
// UUID v4 - Χειροκίνητη υλοποίηση
function generateUUIDv4() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
const r = (crypto.getRandomValues(new Uint8Array(1))[0] & 0x0f) >> (c === 'x' ? 0 : 2);
const v = c === 'x' ? r : (r & 0x3) | 0x8;
return v.toString(16);
});
}
// UUID v7 - Προτείνεται για βάσεις δεδομένων
function generateUUIDv7() {
const timestamp = Date.now();
const timeHi = (timestamp >> 16).toString(16).padStart(8, '0');
const timeLow = (timestamp & 0xFFFF).toString(16).padStart(4, '0');
const randomBytes = crypto.getRandomValues(new Uint8Array(10));
const randomHex = Array.from(randomBytes)
.map(b => b.toString(16).padStart(2, '0'))
.join('');
return `${timeHi}-${timeLow}-7${randomHex.substr(0, 3)}-${randomHex.substr(3, 4)}-${randomHex.substr(7)}`;
}
Python
import uuid
# UUID v4
uuid_v4 = str(uuid.uuid4())
# Output: '6ba7b810-9dad-11d1-80b4-00c04fd430c8'
# UUID v1
uuid_v1 = str(uuid.uuid1())
Java
import java.util.UUID;
// UUID v4
String uuidV4 = UUID.randomUUID().toString();
PHP
// UUID v4 (PHP 7+)
function generateUUID() {
return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x',\
mt_rand(0, 0xffff), mt_rand(0, 0xffff),\
mt_rand(0, 0xffff),\
mt_rand(0, 0x0fff) | 0x4000,\
mt_rand(0, 0x3fff) | 0x8000,\
mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff)\
);\
}
C#
using System;\
// UUID v4\
Guid uuid = Guid.NewGuid();\
string uuidString = uuid.ToString();\
Βέλτιστες Πρακτικές
Αποθήκευση UUID σε βάση δεδομένων
PostgreSQL:
CREATE TABLE users (\
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),\
email VARCHAR(255) NOT NULL,\
created_at TIMESTAMP DEFAULT NOW()\
);\
MySQL 8.0+:
CREATE TABLE users (\
id BINARY(16) PRIMARY KEY DEFAULT (UUID_TO_BIN(UUID())),\
email VARCHAR(255) NOT NULL,\
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\
);\
Συμβουλή: Στο MySQL, αποθηκεύστε τα UUID ως BINARY(16) αντί για CHAR(36) για εξοικονόμηση χώρου και ταχύτερη ευρετηρίαση.
Επικύρωση UUID
function isValidUUID(uuid) {
const regex = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
return regex.test(uuid);
}
Μετατροπή UUID
// Αφαίρεση παύλων
const compact = uuid.replace(/-/g, '');
// Προσθήκη παύλων πίσω
function formatUUID(compactUuid) {
return [
compactUuid.substring(0, 8),
compactUuid.substring(8, 12),
compactUuid.substring(12, 16),
compactUuid.substring(16, 20),
compactUuid.substring(20, 32)
].join('-');
}
Αντιμετώπιση προβλημάτων (Troubleshooting)
Το UUID v3/v5 δεν λειτουργεί
Πρόβλημα: Μετά την επιλογή v3 ή v5, τίποτα δεν δημιουργείται
Λύση:
- ✅ Ελέγξτε ότι έχετε συμπληρώσει το πεδίο “Όνομα” - είναι υποχρεωτικό!
- ✅ Επιλέξτε τον σωστό χώρο ονομάτων ανάλογα με τον τύπο της εισόδου σας
- ✅ Παραδείγματα έγκυρων εισόδων:
- DNS:
example.com,google.com - URL:
https://example.com/page - Οποιοδήποτε κείμενο:
my-application-v1
- DNS:
Συμβουλή: Δοκιμάστε πρώτα μια απλή τιμή όπως test και τον χώρο ονομάτων DNS.
Το UUID με χρονική σήμανση (v1, v6, v7) έχει περίεργο χρόνο
Πρόβλημα: Το δημιουργημένο UUID έχει μια μη αναμενόμενη χρονική σήμανση
Λύση:
- ✅ Ελέγξτε τον επιλογέα ημερομηνίας-ώρας - έχει ρυθμιστεί η σωστή ώρα;
- ✅ Ο επιλογέας ημερομηνίας-ώρας χρησιμοποιεί την τοπική σας ζώνη ώρας
- ✅ Αφήστε τον επιλογέα ημερομηνίας-ώρας κενό για την τρέχουσα ώρα
Το UUID δεν μπορεί να αντιγραφεί
Πρόβλημα: Το κουμπί “Αντιγραφή Όλων” δεν λειτουργεί
Λύση:
- ✅ Ελέγξτε ότι έχετε δημιουργήσει UUID (δεν είναι κενά)
- ✅ Ορισμένα προγράμματα περιήγησης απαιτούν HTTPS για το API του πρόχειρου
- ✅ Εναλλακτικά, επιλέξτε το κείμενο στην περιοχή κειμένου και αντιγράψτε χειροκίνητα (Ctrl+C)
Συχνές Ερωτήσεις (FAQ)
Μπορεί να προκύψει σύγκρουση UUID;
Θεωρητικά ναι, αλλά η πιθανότητα είναι αστρονομικά μικρή. Κατά τη δημιουργία 1 δισεκατομμυρίου UUID v4 ανά δευτερόλεπτο για 100 χρόνια, η πιθανότητα σύγκρουσης είναι περίπου 0,00000006%. Στην πράξη, μια σύγκρουση δεν συμβαίνει ποτέ.Είναι το UUID κατάλληλο ως πρωτεύον κλειδί σε βάση δεδομένων;
Εξαρτάται από την περίπτωση χρήσης. Το UUID είναι ιδανικό για κατανεμημένα συστήματα και περιπτώσεις όπου χρειάζεστε παγκόσμια μοναδικότητα. Για απλές εφαρμογές με μία βάση δεδομένων, ένα auto-increment μπορεί να είναι πιο αποτελεσματικό.Είναι ασφαλή τα UUID που δημιουργούνται από αυτό το εργαλείο;
Ναι, χρησιμοποιούμε το Web Crypto API (`crypto.getRandomValues()`), το οποίο παρέχει κρυπτογραφικά ασφαλείς τυχαίες τιμές. Όλα πραγματοποιούνται τοπικά στο πρόγραμμα περιήγησής σας.Ποια είναι η διαφορά μεταξύ των εκδόσεων UUID;
- **v1**: Χρονική σήμανση + MAC/τυχαίο - χρονολογική ταξινόμηση, χειρότερη απόδοση DB - **v3/v5**: Βασισμένο σε κατακερματισμό - ντετερμινιστικό, για μετατροπή γνωστών αναγνωριστικών - **v4**: Τυχαίο - το ασφαλέστερο, το πιο χρησιμοποιούμενο - **v6**: Αναδιατεταγμένη χρονική σήμανση - καλύτερη απόδοση DB από το v1 - **v7**: Χρονική σήμανση Unix - καλύτερη απόδοση DB + χρονολογική ταξινόμησηΠοια έκδοση UUID πρέπει να χρησιμοποιήσω;
Για τις περισσότερες περιπτώσεις χρησιμοποιήστε το **v4** (τυχαίο). Για βάσεις δεδομένων με χρονολογική ταξινόμηση χρησιμοποιήστε το **v7** (μοντέρνο) ή το **v6** (πρότυπο). Για μετατροπή γνωστών αναγνωριστικών (URL, DNS) χρησιμοποιήστε το **v5** (SHA-1).Μπορώ να χρησιμοποιήσω UUID για tokens και κλειδιά API;
Το UUID v4 είναι κατάλληλο για αναγνωριστικά συνεδριών (session IDs) και παρόμοια tokens. Για κλειδιά API, εξετάστε το ενδεχόμενο χρήσης μεγαλύτερων τυχαίων συμβολοσειρών (π.χ. τιμές 256-bit) ή εξειδικευμένων βιβλιοθηκών.Πόσο μεγάλα είναι τα UUID;
Ένα UUID έχει 128 bits (16 bytes). Σε μορφή συμβολοσειράς με παύλες, καταλαμβάνει 36 χαρακτήρες. Χωρίς παύλες, 32 δεκαεξαδικούς χαρακτήρες.Εναλλακτικές λύσεις για UUID
ULID (Universally Unique Lexicographically Sortable Identifier)
- Αναγνωριστικό 128-bit (όπως το UUID)
- Λεξικογραφικά ταξινομήσιμο με βάση τον χρόνο δημιουργίας
- Πιο συμπαγής αναπαράσταση (26 χαρακτήρες αντί για 36)
- Κωδικοποίηση base32 χωρίς διάκριση πεζών-κεφαλαίων
Παράδειγμα: 01ARZ3NDEKTSV4RRFFQ69G5FAV
NanoID
- Μικρότερο μέγεθος από το UUID (21 χαρακτήρες συνήθως)
- Φιλικό προς URL (χωρίς ειδικούς χαρακτήρες)
- Ταχύτερη δημιουργία
- Ρυθμιζόμενο μήκος και αλφάβητο
Παράδειγμα: V1StGXR8_Z5jdHi6B-myT
Snowflake ID (Twitter)
- Αναγνωριστικό 64-bit (μικρότερο από το UUID)
- Ταξινομήσιμο με βάση τον χρόνο
- Περιλαμβάνει αναγνωριστικό εργάτη (worker ID) και αριθμό ακολουθίας
- Απαιτεί κεντρική ρύθμιση παραμέτρων
Παράδειγμα: 1234567890123456789
Απόδοση και Βελτιστοποίηση
Ταχύτητα δημιουργίας
Η γεννήτορα μας μπορεί να δημιουργήσει:
- 1 UUID: < 1 ms
- 100 UUID: ~10-20 ms
- 1000 UUID: ~100-200 ms
Συμβουλές για απόδοση
- Μαζική δημιουργία (Batch generation) – Εάν χρειάζεστε πολλά UUID, δημιουργήστε τα όλα μαζί αντί για ένα-ένα
- Αποθήκευση σε DB – Ευρετηριάστε τις στήλες UUID για γρήγορη αναζήτηση
- Συμπίεση – Αποθηκεύστε τα UUID σε δυαδική μορφή (16 bytes) αντί για συμβολοσειρά (36 bytes)
- Κρυφή μνήμη (Caching) – Σε ορισμένες περιπτώσεις, μπορείτε να προ-δημιουργήσετε και να αποθηκεύσετε τα UUID σε κρυφή μνήμη
Για προγραμματιστές
Δομή UUID v4
xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
| | | | |
| | | | └─ 48 bits τυχαίων δεδομένων (node)
| | | └────── 16 bits τυχαίων δεδομένων με παραλλαγή (clock_seq)
| | └─────────── 12 bits τυχαίων δεδομένων + 4 bits έκδοσης (time_hi_and_version)
| └──────────────── 16 bits τυχαίων δεδομένων (time_mid)
└───────────────────────── 32 bits τυχαίων δεδομένων (time_low)
- Έκδοση (4 bits): πάντα
0100(δυαδικό) =4(δεκαεξαδικό) - Παραλλαγή (2-3 bits): πάντα
10(δυαδικό) για RFC 4122
Δοκιμή UUID
// Jest test
describe('UUID Generator', () => {
test('generates valid UUID v4', () => {
const uuid = generateUUIDv4();
const regex = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
expect(regex.test(uuid)).toBe(true);
});
test('generates unique UUIDs', () => {
const uuid1 = generateUUIDv4();
const uuid2 = generateUUIDv4();
expect(uuid1).not.toBe(uuid2);
});
});
Θέματα Ασφαλείας
Τι να μην κάνετε με τα UUID
❌ Μην χρησιμοποιείτε UUID v1 για ευαίσθητες εφαρμογές – Περιέχει χρονική σήμανση, κάτι που μπορεί να αποτελέσει κίνδυνο ασφαλείας
❌ Μην χρησιμοποιείτε το Math.random() για τη δημιουργία UUID – Δεν είναι κρυπτογραφικά ασφαλές
❌ Μην βασίζεστε στα UUID για εξουσιοδότηση – Τα UUID μπορούν να μαντευτούν (αν και με εξαιρετικά μικρή πιθανότητα)
❌ Μην αποθηκεύετε UUID σε cookies χωρίς κρυπτογράφηση – Χρησιμοποιήστε υπογεγραμμένα cookies ή JWT
Τι να κάνετε
✅ Χρησιμοποιήστε UUID v4 για τις περισσότερες περιπτώσεις – Υψηλότερη εντροπία και ασφάλεια
✅ Συνδυάστε τα UUID με άλλα μέτρα ασφαλείας – Για τη διαχείριση συνεδριών χρησιμοποιήστε HTTPS, HttpOnly cookies και μικρή λήξη
✅ Επικυρώστε τα UUID στον διακομιστή – Ελέγχετε πάντα τη μορφή και την έκδοση του UUID
✅ Χρησιμοποιήστε κρυπτογραφικά ασφαλείς πηγές τυχαιότητας – crypto.getRandomValues() στο πρόγραμμα περιήγησης, /dev/urandom στο Linux
Ενδιαφέροντα στοιχεία
- Αριθμός πιθανών UUID v4: 2^122 ≈ 5.3 × 10^36 (340 undecillion)
- Απαιτούμενη σύγκρουση: Για 50% πιθανότητα σύγκρουσης, πρέπει να δημιουργήσετε 2.71 × 10^18 UUID (2.71 quintillion)
- Μέγεθος όλων των πιθανών UUID: Εάν αποθηκεύαμε κάθε UUID ως 16 bytes, ολόκληρος ο χώρος θα καταλάμβανε 85 zettabytes (85 δισεκατομμύρια terabytes)
- Προέλευση: Το UUID τυποποιήθηκε ως μέρος του DCE (Distributed Computing Environment) το 1990