Whiz Tools

CUID Generator

Brzo i lako generišite ID otporan na kolizije.

Struktura CUID-a

Vreme:

Nasumično:

CUID Generator

Uvod

CUID (Collision-resistant Unique IDentifier) je jedinstveni identifikator dizajniran da bude otporan na kolizije, horizontalno skalabilan i sekvencijalno sortabilan. CUID-ovi su posebno korisni u distribuiranim sistemima gde jedinstveni identifikatori treba da se generišu bez koordinacije između čvorova.

Struktura CUID-ova

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

  1. Vreme: Predstavlja trenutni trenutak
  2. Brojač: Sekvencijalni brojač koji osigurava jedinstvenost unutar iste milisekunde
  3. Klijentski otisak: Jedinstveni identifikator za mašinu ili proces koji generiše CUID
  4. Nasumična komponenta: Dodatni nasumični podaci za dalju redukciju verovatnoće kolizije

Tačna struktura može varirati u zavisnosti od implementacije CUID-a, ali ove komponente rade zajedno kako bi stvorile jedinstveni i sortabilni 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ćavanje brojača (koji se periodično resetuje)
  3. Generisanje klijentskog otiska (obično se radi 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 string slova i brojeva.

Prednosti i slučajevi korišćenja

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. Sekvencijalno sortiranje: Komponenta vremena omogućava hronološko sortiranje CUID-ova.
  4. Prijateljski prema URL-ovima: CUID-ovi se obično sastoje od karaktera koji su bezbedni za URL.

Uobičajeni slučajevi korišćenja CUID-ova uključuju:

  • Primarni ključevi u bazama podataka
  • Distribuirani sistemi gde jedinstveni ID-ovi treba da se generišu na više čvorova
  • ID-ovi sesija u veb aplikacijama
  • Praćenje događaja u analitičkim sistemima
  • Imenovanje fajlova ili resursa u sistemima cloud skladištenja

Primeri koda

Evo primera generisanja CUID-ova u raznim programskim jezicima:

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

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

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

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

func main() {
    id := cuid.New()
    fmt.Println(id)
}
// Swift (koristeći paket 'CUID')
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 Elliot-a 2012. godine kao rešenje za problem generisanja jedinstvenih identifikatora u distribuiranim sistemima. Koncept je inspirisan Twitter-ovim Snowflake ID sistemom, ali je osmišljen da bude lakše implementiran i korišćen u raznim platformama.

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

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

  1. Prva implementacija CUID-a 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. uveden 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 originalni koncept korišćenjem sigurnijeg generatora nasumičnih brojeva i povećanjem ukupne dužine identifikatora.

Evolucija CUID-ova odražava promene u potrebama distribuiranih sistema i stalne 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 alat za generisanje CUID-ova omogućava vam brzo generisanje CUID-ova za vaše projekte. Jednostavno kliknite na dugme "Generiši" da biste kreirali novi CUID, a koristite dugme "Kopiraj" da biste ga kopirali u vaš međuspremnik za lakšu upotrebu u vašim aplikacijama.

Feedback