Whiz Tools

Γεννήτρια CUID

Δημιουργήστε ένα ID ανθεκτικό σε συγκρούσεις γρήγορα και εύκολα.

Δομή CUID

Χρονική Σημείωση:

Τυχαίο:

Γεννήτρια CUID

Εισαγωγή

Ένα CUID (Collision-resistant Unique IDentifier) είναι ένας μοναδικός αναγνωριστικός αριθμός σχεδιασμένος να είναι ανθεκτικός σε συγκρούσεις, οριζόντια κλιμακούμενος και διατεταγμένος κατά σειρά. Τα CUID είναι ιδιαίτερα χρήσιμα σε κατανεμημένα συστήματα όπου οι μοναδικοί αναγνωριστικοί αριθμοί χρειάζεται να παραχθούν χωρίς συντονισμό μεταξύ των κόμβων.

Δομή των CUID

Ένα CUID συνήθως αποτελείται από τα εξής στοιχεία:

  1. Χρονική σήμανση: Μια αναπαράσταση της τρέχουσας ώρας
  2. Μετρητής: Ένας διαδοχικός μετρητής για να διασφαλιστεί η μοναδικότητα εντός της ίδιας χιλιοστά του δευτερολέπτου
  3. Δακτυλικό αποτύπωμα πελάτη: Ένας μοναδικός αναγνωριστικός αριθμός για τη μηχανή ή τη διαδικασία που παράγει το CUID
  4. Τυχαίο στοιχείο: Πρόσθετα τυχαία δεδομένα για να μειωθεί περαιτέρω η πιθανότητα συγκρούσεων

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

Ακολουθεί μια οπτική αναπαράσταση μιας τυπικής δομής CUID:

Χρονική σήμανση Μετρητής Δακτυλικό αποτύπωμα Τυχαίο

Πώς παράγονται τα CUID

Τα CUID παράγονται χρησιμοποιώντας έναν συνδυασμό χρονικών και τυχαίων στοιχείων. Η διαδικασία συνήθως περιλαμβάνει:

  1. Λήψη της τρέχουσας χρονικής σήμανσης
  2. Αυξάνοντας έναν μετρητή (ο οποίος επαναρυθμίζεται περιοδικά)
  3. Δημιουργία ενός δακτυλικού αποτυπώματος πελάτη (συνήθως γίνεται μία φορά ανά συνεδρία ή εκκίνηση εφαρμογής)
  4. Προσθήκη τυχαίων δεδομένων
  5. Συνδυασμός αυτών των στοιχείων σε μια συγκεκριμένη μορφή

Το προκύπτον CUID συνήθως αναπαρίσταται ως μια συμβολοσειρά γραμμάτων και αριθμών.

Πλεονεκτήματα και Χρήσεις

Τα CUID προσφέρουν αρκετά πλεονεκτήματα σε σχέση με άλλα συστήματα μοναδικών αναγνωριστικών:

  1. Ανθεκτικότητα σε συγκρούσεις: Ο συνδυασμός χρονικής σήμανσης, μετρητή και τυχαίων δεδομένων καθιστά τις συγκρούσεις εξαιρετικά απίθανες, ακόμη και σε κατανεμημένα συστήματα.
  2. Οριζόντια κλιμάκωση: Τα CUID μπορούν να παραχθούν ανεξάρτητα σε πολλές μηχανές χωρίς συντονισμό.
  3. Διατεταγμένη ταξινόμηση: Το στοιχείο χρονικής σήμανσης επιτρέπει την χρονολογική ταξινόμηση των CUID.
  4. Φιλικά προς το URL: Τα CUID συνήθως αποτελούνται από χαρακτήρες που είναι ασφαλείς για URL.

Κοινές χρήσεις για τα CUID περιλαμβάνουν:

  • Πρωτεύοντα κλειδιά βάσης δεδομένων
  • Κατανεμημένα συστήματα όπου χρειάζεται να παραχθούν μοναδικά ID σε πολλούς κόμβους
  • ID συνεδριών σε διαδικτυακές εφαρμογές
  • Παρακολούθηση γεγονότων σε συστήματα ανάλυσης
  • Ονοματοδοσία αρχείων ή πόρων σε συστήματα αποθήκευσης στο σύννεφο

Παραδείγματα Κώδικα

Ακολουθούν παραδείγματα δημιουργίας CUID σε διάφορες γλώσσες προγραμματισμού:

// JavaScript (χρησιμοποιώντας τη βιβλιοθήκη 'cuid')
const cuid = require('cuid');
const id = cuid();
console.log(id);
## Python (χρησιμοποιώντας τη βιβλιοθήκη 'cuid')
import cuid
id = cuid.cuid()
print(id)
## Ruby (χρησιμοποιώντας το 'cuid' gem)
require 'cuid'
id = Cuid::generate
puts id
// Java (χρησιμοποιώντας τη βιβλιοθήκη 'com.github.f4b6a3.cuid')
import com.github.f4b6a3.cuid.Cuid;

public class CuidExample {
    public static void main(String[] args) {
        String id = Cuid.createCuid();
        System.out.println(id);
    }
}
// C# (χρησιμοποιώντας το πακέτο NuGet 'Cuid.Net')
using Cuid;

class Program
{
    static void Main(string[] args)
    {
        string id = CuidGenerator.Generate();
        Console.WriteLine(id);
    }
}
// PHP (χρησιμοποιώντας το πακέτο 'endyjasmi/cuid')
<?php
require 'vendor/autoload.php';
use Endyjasmi\Cuid\Cuid;

$id = Cuid::make();
echo $id;
// Go (χρησιμοποιώντας το πακέτο 'github.com/lucsky/cuid')
package main

import (
    "fmt"
    "github.com/lucsky/cuid"
)

func main() {
    id := cuid.New()
    fmt.Println(id)
}
// Swift (χρησιμοποιώντας το πακέτο 'CUID')
import CUID

let id = CUID()
print(id)
// C++ (χρησιμοποιώντας μια προσαρμοσμένη υλοποίηση)
#include <iostream>
#include <chrono>
#include <random>
#include <sstream>
#include <iomanip>

std::string generateCUID() {
    auto now = std::chrono::system_clock::now();
    auto now_ms = std::chrono::time_point_cast<std::chrono::milliseconds>(now);
    auto value = now_ms.time_since_epoch();
    long duration = value.count();

    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_int_distribution<> dis(0, 35);

    std::stringstream ss;
    ss << 'c';
    ss << std::hex << std::setfill('0') << std::setw(8) << duration;
    for (int i = 0; i < 8; i++) {
        int r = dis(gen);
        ss << (char)(r < 10 ? '0' + r : 'a' + r - 10);
    }
    return ss.str();
}

int main() {
    std::string id = generateCUID();
    std::cout << id << std::endl;
    return 0;
}
% MATLAB (χρησιμοποιώντας μια προσαρμοσμένη υλοποίηση)
function id = generateCUID()
    timestamp = dec2hex(round(posixtime(datetime('now'))*1000), 8);
    random = '';
    for i = 1:8
        random = [random char(randi([48 57 97 122]))];
    end
    id = ['c' timestamp random];
end

% Χρήση
id = generateCUID();
disp(id);
## R (χρησιμοποιώντας μια προσαρμοσμένη υλοποίηση)
library(lubridate)

generate_cuid <- function() {
  timestamp <- format(as.numeric(now()) * 1000, scientific = FALSE)
  timestamp <- substr(timestamp, 1, 8)
  random <- paste0(sample(c(0:9, letters[1:6]), 8, replace = TRUE), collapse = "")
  paste0("c", timestamp, random)
}

## Χρήση
id <- generate_cuid()
print(id)
' Excel VBA (χρησιμοποιώντας μια προσαρμοσμένη υλοποίηση)
Function GenerateCUID() As String
    Dim timestamp As String
    Dim random As String
    Dim i As Integer
    
    timestamp = Right("00000000" & Hex(CLng(CDbl(Now()) * 86400000)), 8)
    
    For i = 1 To 8
        random = random & Mid("0123456789abcdef", Int(Rnd() * 16) + 1, 1)
    Next i
    
    GenerateCUID = "c" & timestamp & random
End Function

' Χρήση σε ένα κελί
'=GenerateCUID()

Ιστορία και Ανάπτυξη

Τα CUID αναπτύχθηκαν αρχικά από τον Eric Elliott το 2012 ως λύση στο πρόβλημα της παραγωγής μοναδικών αναγνωριστικών σε κατανεμημένα συστήματα. Η έννοια εμπνεύστηκε από το σύστημα αναγνωριστικών Snowflake του Twitter αλλά σχεδιάστηκε για να είναι πιο εύκολα υλοποιήσιμη και χρησιμοποιήσιμη σε διάφορες πλατφόρμες.

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

Από την ίδρυσή του, το CUID έχει περάσει από πολλές επαναλήψεις και βελτιώσεις:

  1. Η αρχική υλοποίηση του CUID επικεντρώθηκε στην απλότητα και τη χρηστικότητα.
  2. Καθώς η υιοθέτηση αυξήθηκε, η κοινότητα συνέβαλε με υλοποιήσεις σε διάφορες γλώσσες προγραμματισμού.
  3. Το 2021, εισήχθη το CUID2 για να αντιμετωπίσει ορισμένους περιορισμούς του αρχικού CUID και να προσφέρει ακόμη καλύτερη απόδοση και ανθεκτικότητα σε συγκρούσεις.
  4. Το CUID2 βελτίωσε την αρχική έκδοση χρησιμοποιώντας έναν πιο ασφαλή τυχαίο αριθμό και αυξάνοντας το συνολικό μήκος του αναγνωριστικού.

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

Αναφορές

  1. Επίσημο αποθετήριο CUID στο GitHub
  2. Προδιαγραφή CUID2
  3. Elliott, Eric. "Generating Unique IDs in a Distributed Environment." Medium, 2015.
  4. "Collision-resistant IDs for Distributed Systems." DZone, 2018.

Αυτό το εργαλείο γεννήτριας CUID σας επιτρέπει να δημιουργείτε γρήγορα CUID για τα έργα σας. Απλά κάντε κλικ στο κουμπί "Γεννήστε" για να δημιουργήσετε ένα νέο CUID και χρησιμοποιήστε το κουμπί "Αντιγραφή" για να το αντιγράψετε στο πρόχειρο σας για εύκολη χρήση στις εφαρμογές σας.

Feedback