Whiz Tools

Generator CUID

Generați rapid și ușor un ID rezistent la coliziuni.

Structura CUID

Timestamp:

Aleator:

Generator CUID

Introducere

Un CUID (Identificator Unic Rezistent la Coliziune) este un identificator unic conceput pentru a fi rezistent la coliziuni, scalabil pe orizontală și sortabil secvențial. CUID-urile sunt deosebit de utile în sistemele distribuite unde identificatorii unici trebuie generați fără coordonare între noduri.

Structura CUID-urilor

Un CUID constă de obicei din următoarele componente:

  1. Timestamp: O reprezentare a timpului curent
  2. Counter: Un contor secvențial pentru a asigura unicitatea în aceeași milisecundă
  3. Amprenta clientului: Un identificator unic pentru mașina sau procesul care generează CUID-ul
  4. Componenta aleatoare: Date suplimentare aleatoare pentru a reduce și mai mult probabilitatea coliziunilor

Structura exactă poate varia în funcție de implementarea CUID, dar aceste componente lucrează împreună pentru a crea un identificator unic și sortabil.

Iată o reprezentare vizuală a unei structuri tipice CUID:

Timestamp Counter Amprentă Aleator

Cum sunt generate CUID-urile

CUID-urile sunt generate folosind o combinație de componente bazate pe timp și aleatorii. Procesul implică de obicei:

  1. Obținerea timestamp-ului curent
  2. Incrementarea unui contor (care se resetează periodic)
  3. Generarea unei amprente a clientului (de obicei realizată o dată pe sesiune sau la pornirea aplicației)
  4. Adăugarea de date aleatoare
  5. Combinarea acestor elemente într-un format specific

CUID-ul rezultat este de obicei reprezentat ca un șir de litere și cifre.

Avantaje și cazuri de utilizare

CUID-urile oferă mai multe avantaje față de alte sisteme de identificatori unici:

  1. Rezistență la coliziuni: Combinația de timestamp, contor și date aleatoare face ca coliziunile să fie extrem de puțin probabile, chiar și în sistemele distribuite.
  2. Scalabilitate pe orizontală: CUID-urile pot fi generate independent pe mai multe mașini fără coordonare.
  3. Sortare secvențială: Componenta timestamp permite sortarea cronologică a CUID-urilor.
  4. Prietenoase cu URL-urile: CUID-urile sunt de obicei compuse din caractere sigure pentru URL.

Cazuri comune de utilizare pentru CUID-uri includ:

  • Chei primare în baze de date
  • Sisteme distribuite în care ID-uri unice trebuie generate pe mai multe noduri
  • ID-uri de sesiune în aplicații web
  • Urmărirea evenimentelor în sistemele de analiză
  • Denumirea fișierelor sau resurselor în sistemele de stocare în cloud

Exemple de cod

Iată exemple de generare a CUID-urilor în diferite limbaje de programare:

// JavaScript (folosind biblioteca 'cuid')
const cuid = require('cuid');
const id = cuid();
console.log(id);
## Python (folosind biblioteca 'cuid')
import cuid
id = cuid.cuid()
print(id)
## Ruby (folosind gem-ul 'cuid')
require 'cuid'
id = Cuid::generate
puts id
// Java (folosind biblioteca '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# (folosind pachetul NuGet 'Cuid.Net')
using Cuid;

class Program
{
    static void Main(string[] args)
    {
        string id = CuidGenerator.Generate();
        Console.WriteLine(id);
    }
}
// PHP (folosind pachetul 'endyjasmi/cuid')
<?php
require 'vendor/autoload.php';
use Endyjasmi\Cuid\Cuid;

$id = Cuid::make();
echo $id;
// Go (folosind pachetul 'github.com/lucsky/cuid')
package main

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

func main() {
    id := cuid.New()
    fmt.Println(id)
}
// Swift (folosind pachetul 'CUID')
import CUID

let id = CUID()
print(id)
// C++ (folosind o implementare personalizată)
#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 (folosind o implementare personalizată)
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

% Utilizare
id = generateCUID();
disp(id);
## R (folosind o implementare personalizată)
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)
}

## Utilizare
id <- generate_cuid()
print(id)
' Excel VBA (folosind o implementare personalizată)
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

' Utilizare într-o celulă
'=GenerateCUID()

Istoric și dezvoltare

CUID-urile au fost dezvoltate inițial de Eric Elliott în 2012 ca o soluție la problema generării identificatorilor unici în sistemele distribuite. Conceptul a fost inspirat de sistemul de ID-uri Snowflake de la Twitter, dar conceput pentru a fi mai ușor de implementat și utilizat pe diferite platforme.

Dezvoltarea CUID-urilor a fost determinată de nevoia de a avea un sistem simplu, rezistent la coliziuni, care să funcționeze pe diferite limbaje de programare și medii. Scopul lui Elliott a fost să creeze un sistem care să fie ușor de implementat, să nu necesite coordonare centrală și să poată scala pe orizontală.

De la înființarea sa, CUID a trecut prin mai multe iterații și îmbunătățiri:

  1. Implementarea originală CUID s-a concentrat pe simplitate și ușurință în utilizare.
  2. Pe măsură ce adoptarea a crescut, comunitatea a contribuit cu implementări în diferite limbaje de programare.
  3. În 2021, CUID2 a fost introdus pentru a aborda unele limitări ale CUID-ului original și pentru a oferi o performanță și o rezistență la coliziuni și mai bune.
  4. CUID2 a îmbunătățit originalul prin utilizarea unui generator de numere aleatoare mai sigur și prin creșterea lungimii totale a identificatorului.

Evoluția CUID-urilor reflectă nevoile în schimbare ale sistemelor distribuite și eforturile continue de a echilibra simplitatea, securitatea și performanța în generarea identificatorilor unici.

Referințe

  1. Repository-ul oficial CUID pe GitHub
  2. Specificația CUID2
  3. Elliott, Eric. "Generarea ID-urilor unice într-un mediu distribuit." Medium, 2015.
  4. "ID-uri rezistente la coliziuni pentru sisteme distribuite." DZone, 2018.

Acest instrument generator CUID vă permite să generați rapid CUID-uri pentru proiectele dumneavoastră. Faceți clic pe butonul "Generați" pentru a crea un nou CUID și folosiți butonul "Copiați" pentru a-l copia în clipboard pentru utilizare ușoară în aplicațiile dumneavoastră.

Feedback