Γεννήτρια 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 βάσει του χρόνου δημιουργίας της εγγραφής
  • Αναδρομική δημιουργία αναγνωριστικών

Παράδειγμα χρήσης:

  1. Επιλέξτε έκδοση v1, v6 ή v7
  2. Ρυθμίστε την ημερομηνία και ώρα χρησιμοποιώντας τον επιλογέα ημερομηνίας-ώρας
  3. Δημιουργήστε UUID με τη δική σας χρονική σήμανση

UUID βασισμένο σε κατακερματισμό (v3, v5)

Για ντετερμινιστικά UUID, μπορείτε να χρησιμοποιήσετε τις εκδόσεις v3 (MD5) ή v5 (SHA-1):

Πώς να χρησιμοποιήσετε:

  1. Επιλέξτε το χώρο ονομάτων ανάλογα με τον τύπο του αναγνωριστικού σας
  2. Εισαγάγετε το όνομα/την τιμή
  3. Δημιουργήστε το UUID

Παραδείγματα:

Χώρος ονομάτωνΌνομα (είσοδος)Χρήση
DNSexample.comΜετατροπή ονόματος τομέα σε UUID
DNSgoogle.comΚάθε ιστότοπος έχει μοναδικό UUID
URLhttps://example.com/pageΜετατροπή URL σε UUID
URLhttps://api.example.com/users/123Τελικό σημείο API ως UUID
OID1.3.6.1.4.1.343Αναγνωριστικό αντικειμένου σε UUID
X.500CN=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Χαμηλή✅ Ναι❌ ΧειρότερηΠαλαιό, έλεγχος
v3MD5 κατακερματισμόςΚαμία (ντετερμινιστικό)❌ Όχι⚠️ ΜέτριαΜετατροπές (παλαιό)
v4ΤυχαίοΕξαιρετικά χαμηλή❌ Όχι⚠️ ΜέτριαΓενική χρήση
v5SHA-1 κατακερματισμόςΚαμία (ντετερμινιστικό)❌ Όχι⚠️ ΜέτριαΜετατροπές (προτεινόμενο)
v6Ταξινομημένη χρονική σήμανσηΧαμηλή✅ Ναι✅ ΚαλύτερηΣύγχρονες DB με χρόνο
v7Χρονική σήμανση UnixΧαμηλή✅ Ναι✅ ΚαλύτερηΝέα έργα

UUID έναντι άλλων αναγνωριστικών

ΤύποςΜέγεθοςΣύγκρουσηΧρονολογική ταξινόμησηΧρήση
Αναγνωριστικό αυτόματης αύξησης4-8 bytesΕγγυημένα μοναδικό εντός πίνακαΑπλές εφαρμογές, τοπική DB
UUID v416 bytesΠρακτικά αδύνατοΚατανεμημένα συστήματα, API
UUID v716 bytesΠρακτικά αδύνατοΣύγχρονες DB με απόδοση
ULID16 bytesΠρακτικά αδύνατοUUID + λεξικογραφική ταξινόμηση
Snowflake ID8 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, τίποτα δεν δημιουργείται

Λύση:

  1. ✅ Ελέγξτε ότι έχετε συμπληρώσει το πεδίο “Όνομα” - είναι υποχρεωτικό!
  2. ✅ Επιλέξτε τον σωστό χώρο ονομάτων ανάλογα με τον τύπο της εισόδου σας
  3. ✅ Παραδείγματα έγκυρων εισόδων:
    • DNS: example.com, google.com
    • URL: https://example.com/page
    • Οποιοδήποτε κείμενο: my-application-v1

Συμβουλή: Δοκιμάστε πρώτα μια απλή τιμή όπως test και τον χώρο ονομάτων DNS.

Το UUID με χρονική σήμανση (v1, v6, v7) έχει περίεργο χρόνο

Πρόβλημα: Το δημιουργημένο UUID έχει μια μη αναμενόμενη χρονική σήμανση

Λύση:

  1. ✅ Ελέγξτε τον επιλογέα ημερομηνίας-ώρας - έχει ρυθμιστεί η σωστή ώρα;
  2. ✅ Ο επιλογέας ημερομηνίας-ώρας χρησιμοποιεί την τοπική σας ζώνη ώρας
  3. ✅ Αφήστε τον επιλογέα ημερομηνίας-ώρας κενό για την τρέχουσα ώρα

Το UUID δεν μπορεί να αντιγραφεί

Πρόβλημα: Το κουμπί “Αντιγραφή Όλων” δεν λειτουργεί

Λύση:

  1. ✅ Ελέγξτε ότι έχετε δημιουργήσει UUID (δεν είναι κενά)
  2. ✅ Ορισμένα προγράμματα περιήγησης απαιτούν HTTPS για το API του πρόχειρου
  3. ✅ Εναλλακτικά, επιλέξτε το κείμενο στην περιοχή κειμένου και αντιγράψτε χειροκίνητα (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

Συμβουλές για απόδοση

  1. Μαζική δημιουργία (Batch generation) – Εάν χρειάζεστε πολλά UUID, δημιουργήστε τα όλα μαζί αντί για ένα-ένα
  2. Αποθήκευση σε DB – Ευρετηριάστε τις στήλες UUID για γρήγορη αναζήτηση
  3. Συμπίεση – Αποθηκεύστε τα UUID σε δυαδική μορφή (16 bytes) αντί για συμβολοσειρά (36 bytes)
  4. Κρυφή μνήμη (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