Whiz Tools

CUID Generator

Brzo i jednostavno generirajte ID otporan na sudare.

Struktura CUID-a

Vremenska oznaka:

Nasumično:

CUID Generator

Uvod

CUID (Collision-resistant Unique IDentifier) je jedinstveni identifikator dizajniran da bude otporan na kolizije, horizontalno skalabilan i sekvencijski sortirajući. CUID-ovi su posebno korisni u distribuiranim sistemima gde je potrebno generisati jedinstvene identifikatore bez koordinacije između čvorova.

Struktura CUID-ova

CUID obično se sastoji od sledećih komponenti:

  1. Vreme: Predstavljanje trenutnog vremena
  2. Brojač: Sekvencijski brojač koji osigurava jedinstvenost unutar iste milisekunde
  3. Otisak klijenta: Jedinstveni identifikator za mašinu ili proces koji generiše CUID
  4. Nasumična komponenta: Dodatni nasumični podaci koji dodatno smanjuju verovatnoću kolizije

Tačna struktura može varirati u zavisnosti od implementacije CUID-a, ali ove komponente rade zajedno kako bi stvorile jedinstveni i sortirajući identifikator.

Evo vizuelne reprezentacije tipične strukture CUID-a:

Vreme Brojač Otisak Nasumično

Kako se generišu CUID-ovi

CUID-ovi se generišu korišćenjem kombinacije vremenskih i nasumičnih komponenti. Proces obično uključuje:

  1. Dobijanje trenutnog vremena
  2. Povećanje brojača (koji se periodično resetuje)
  3. Generisanje otiska klijenta (obično se vrši jednom po sesiji ili pokretanju aplikacije)
  4. Dodavanje nasumičnih podataka
  5. Kombinovanje ovih elemenata u specifičnom formatu

Rezultantni CUID obično se predstavlja kao niz slova i brojeva.

Prednosti i upotrebe

CUID-ovi nude nekoliko prednosti u odnosu na druge sisteme jedinstvenih identifikatora:

  1. Otpornost na kolizije: Kombinacija vremena, brojača i nasumičnih podataka čini kolizije izuzetno malo verovatnim, čak i u distribuiranim sistemima.
  2. Horizontalna skalabilnost: CUID-ovi se mogu generisati nezavisno na više mašina bez koordinacije.
  3. Sekvencijsko sortiranje: Komponenta vremena omogućava hronološko sortiranje CUID-ova.
  4. URL-prijateljski: CUID-ovi se obično sastoje od URL-sigurnih karaktera.

Uobičajene upotrebe CUID-ova uključuju:

  • Primarni ključevi u bazama podataka
  • Distribuirani sistemi gde je potrebno generisati jedinstvene ID-ove na više čvorova
  • ID-evi sesija u web aplikacijama
  • Praćenje događaja u analitičkim sistemima
  • Imena datoteka ili resursa u sistemima za skladištenje u oblaku

Primeri koda

Evo primera generisanja CUID-ova u raznim programskim jezicima:

// JavaScript (koristeći 'cuid' biblioteku)
const cuid = require('cuid');
const id = cuid();
console.log(id);
## Python (koristeći 'cuid' biblioteku)
import cuid
id = cuid.cuid()
print(id)
## Ruby (koristeći 'cuid' gem)
require 'cuid'
id = Cuid::generate
puts id
// Java (koristeći 'com.github.f4b6a3.cuid' biblioteku)
import com.github.f4b6a3.cuid.Cuid;

public class CuidExample {
    public static void main(String[] args) {
        String id = Cuid.createCuid();
        System.out.println(id);
    }
}
// C# (koristeći 'Cuid.Net' NuGet paket)
using Cuid;

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

$id = Cuid::make();
echo $id;
// Go (koristeći 'github.com/lucsky/cuid' paket)
package main

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

func main() {
    id := cuid.New()
    fmt.Println(id)
}
// Swift (koristeći 'CUID' paket)
import CUID

let id = CUID()
print(id)
// C++ (koristeći prilagođenu implementaciju)
#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 (koristeći prilagođenu implementaciju)
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

% Upotreba
id = generateCUID();
disp(id);
## R (koristeći prilagođenu implementaciju)
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)
}

## Upotreba
id <- generate_cuid()
print(id)
' Excel VBA (koristeći prilagođenu implementaciju)
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

' Upotreba u ćeliji
'=GenerateCUID()

Istorija i razvoj

CUID-ovi su prvobitno razvijeni od strane Erica Elliotta 2012. godine kao rešenje za problem generisanja jedinstvenih identifikatora u distribuiranim sistemima. Koncept je inspirisan Twitter-ovim Snowflake ID sistemom, ali je dizajniran da bude lakše implementiran i korišćen u raznim platformama.

Razvoj CUID-ova bio je vođen potrebom za jednostavnim, otporom na kolizije ID sistemom koji bi mogao raditi u različitim programskim jezicima i okruženjima. Elliottov cilj bio je stvoriti sistem koji je lako implementirati, koji ne zahteva centralnu koordinaciju i koji može horizontalno skalirati.

Od svog nastanka, CUID je prošao kroz nekoliko iteracija i poboljšanja:

  1. Prva CUID implementacija fokusirala se na jednostavnost i lakoću korišćenja.
  2. Kako je usvajanje raslo, zajednica je doprinela implementacijama u raznim programskim jezicima.
  3. Godine 2021. predstavljena je CUID2 kako bi se rešili neki od ograničenja originalnog CUID-a i pružila još bolja performansa i otpornost na kolizije.
  4. CUID2 je poboljšao original tako što je koristio sigurniji generator nasumičnih brojeva i povećao ukupnu dužinu identifikatora.

Evolucija CUID-ova odražava promene u potrebama distribuiranih sistema i kontinuirane napore da se postigne ravnoteža između jednostavnosti, sigurnosti i performansi u generisanju jedinstvenih identifikatora.

Reference

  1. Zvanični CUID GitHub Repozitorij
  2. CUID2 Specifikacija
  3. Elliott, Eric. "Generisanje jedinstvenih ID-ova u distribuiranom okruženju." Medium, 2015.
  4. "ID-ovi otporni na kolizije za distribuirane sisteme." DZone, 2018.

Ovaj CUID generator alat omogućava vam brzo generisanje CUID-ova za vaše projekte. Jednostavno kliknite na dugme "Generiši" da biste kreirali novi CUID, i koristite dugme "Kopiraj" da biste ga kopirali u vaš međuspremnik za laku upotrebu u vašim aplikacijama.

Feedback