Whiz Tools

Generatore CUID

Genera un ID resistente alle collisioni rapidamente e facilmente.

Struttura CUID

Timestamp:

Casuale:

Generatore di CUID

Introduzione

Un CUID (Collision-resistant Unique IDentifier) è un identificatore unico progettato per essere resistente alle collisioni, orizzontalmente scalabile e ordinabile in modo sequenziale. I CUID sono particolarmente utili nei sistemi distribuiti in cui è necessario generare identificatori unici senza coordinazione tra i nodi.

Struttura dei CUID

Un CUID tipicamente consiste nei seguenti componenti:

  1. Timestamp: Una rappresentazione dell'ora attuale
  2. Contatore: Un contatore sequenziale per garantire l'unicità all'interno della stessa millisecondo
  3. Impronta del client: Un identificatore unico per la macchina o il processo che genera il CUID
  4. Componente casuale: Dati casuali aggiuntivi per ridurre ulteriormente la probabilità di collisione

La struttura esatta può variare a seconda dell'implementazione del CUID, ma questi componenti lavorano insieme per creare un identificatore unico e ordinabile.

Ecco una rappresentazione visiva di una tipica struttura CUID:

Timestamp Contatore Impronta Casuale

Come vengono generati i CUID

I CUID vengono generati utilizzando una combinazione di componenti basati sul tempo e casuali. Il processo tipicamente prevede:

  1. Ottenere il timestamp attuale
  2. Incrementare un contatore (che si resetta periodicamente)
  3. Generare un'impronta del client (di solito eseguita una sola volta per sessione o avvio dell'applicazione)
  4. Aggiungere dati casuali
  5. Combinare questi elementi in un formato specifico

Il CUID risultante è tipicamente rappresentato come una stringa di lettere e numeri.

Vantaggi e casi d'uso

I CUID offrono diversi vantaggi rispetto ad altri sistemi di identificazione unici:

  1. Resistenza alle collisioni: La combinazione di timestamp, contatore e dati casuali rende estremamente improbabili le collisioni, anche nei sistemi distribuiti.
  2. Scalabilità orizzontale: I CUID possono essere generati in modo indipendente su più macchine senza coordinazione.
  3. Ordinamento sequenziale: Il componente timestamp consente l'ordinamento cronologico dei CUID.
  4. Sicurezza in URL: I CUID sono tipicamente composti da caratteri sicuri per gli URL.

I casi d'uso comuni per i CUID includono:

  • Chiavi primarie nei database
  • Sistemi distribuiti in cui è necessario generare ID unici su più nodi
  • ID di sessione nelle applicazioni web
  • Tracciamento degli eventi nei sistemi di analisi
  • Nominativi di file o risorse nei sistemi di archiviazione cloud

Esempi di codice

Ecco esempi di generazione di CUID in vari linguaggi di programmazione:

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

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

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

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

func main() {
    id := cuid.New()
    fmt.Println(id)
}
// Swift (utilizzando il pacchetto 'CUID')
import CUID

let id = CUID()
print(id)
// C++ (utilizzando un'implementazione personalizzata)
#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 (utilizzando un'implementazione personalizzata)
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

% Utilizzo
id = generateCUID();
disp(id);
## R (utilizzando un'implementazione personalizzata)
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)
}

## Utilizzo
id <- generate_cuid()
print(id)
' Excel VBA (utilizzando un'implementazione personalizzata)
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

' Utilizzo in una cella
'=GenerateCUID()

Storia e sviluppo

I CUID sono stati originariamente sviluppati da Eric Elliott nel 2012 come soluzione al problema della generazione di identificatori unici nei sistemi distribuiti. Il concetto è stato ispirato dal sistema di ID Snowflake di Twitter, ma progettato per essere più facilmente implementato e utilizzato su varie piattaforme.

Lo sviluppo dei CUID è stato guidato dalla necessità di un sistema di ID semplice e resistente alle collisioni che potesse funzionare su diversi linguaggi di programmazione e ambienti. L'obiettivo di Elliott era creare un sistema che fosse facile da implementare, non richiedesse coordinazione centrale e potesse scalare orizzontalmente.

Dalla sua nascita, i CUID hanno subito diverse iterazioni e miglioramenti:

  1. L'implementazione originale del CUID si concentrava sulla semplicità e facilità d'uso.
  2. Con la crescita dell'adozione, la comunità ha contribuito con implementazioni in vari linguaggi di programmazione.
  3. Nel 2021, è stato introdotto il CUID2 per affrontare alcune limitazioni del CUID originale e fornire prestazioni e resistenza alle collisioni migliori.
  4. Il CUID2 ha migliorato l'originale utilizzando un generatore di numeri casuali più sicuro e aumentando la lunghezza complessiva dell'identificatore.

L'evoluzione dei CUID riflette le esigenze in cambiamento dei sistemi distribuiti e gli sforzi continui per bilanciare semplicità, sicurezza e prestazioni nella generazione di identificatori unici.

Riferimenti

  1. Repository ufficiale di CUID su GitHub
  2. Specifiche di CUID2
  3. Elliott, Eric. "Generazione di ID unici in un ambiente distribuito." Medium, 2015.
  4. "ID resistenti alle collisioni per sistemi distribuiti." DZone, 2018.

Questo strumento generatore di CUID ti consente di generare rapidamente CUID per i tuoi progetti. Basta fare clic sul pulsante "Genera" per creare un nuovo CUID e utilizzare il pulsante "Copia" per copiarlo negli appunti per un facile utilizzo nelle tue applicazioni.

Feedback