CUID Generator: Jedinstveni Identifikatori za Distribuirane Sisteme
Generišite jedinstvene identifikatore otporne na kolizije (CUID) za distribuirane sisteme, baze podataka i web aplikacije. Ovaj alat stvara CUID-ove koji su skalabilni, sortirani i vrlo malo verovatno da će doći do kolizije.
CUID Generator
Brzo i lako generišite ID otporan na kolizije.
Struktura CUID-a
Vreme:
Nasumično:
Dokumentacija
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:
- Vreme: Predstavlja trenutni trenutak
- Brojač: Sekvencijalni brojač koji osigurava jedinstvenost unutar iste milisekunde
- Klijentski otisak: Jedinstveni identifikator za mašinu ili proces koji generiše CUID
- 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:
Kako se generišu CUID-ovi
CUID-ovi se generišu korišćenjem kombinacije vremenskih i nasumičnih komponenti. Proces obično uključuje:
- Dobijanje trenutnog vremena
- Povećavanje brojača (koji se periodično resetuje)
- Generisanje klijentskog otiska (obično se radi jednom po sesiji ili pokretanju aplikacije)
- Dodavanje nasumičnih podataka
- 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:
- Otpornost na kolizije: Kombinacija vremena, brojača i nasumičnih podataka čini kolizije izuzetno malo verovatnim, čak i u distribuiranim sistemima.
- Horizontalna skalabilnost: CUID-ovi se mogu generisati nezavisno na više mašina bez koordinacije.
- Sekvencijalno sortiranje: Komponenta vremena omogućava hronološko sortiranje CUID-ova.
- 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:
1// JavaScript (koristeći biblioteku 'cuid')
2const cuid = require('cuid');
3const id = cuid();
4console.log(id);
5
1## Python (koristeći biblioteku 'cuid')
2import cuid
3id = cuid.cuid()
4print(id)
5
1## Ruby (koristeći gem 'cuid')
2require 'cuid'
3id = Cuid::generate
4puts id
5
1// Java (koristeći biblioteku 'com.github.f4b6a3.cuid')
2import com.github.f4b6a3.cuid.Cuid;
3
4public class CuidExample {
5 public static void main(String[] args) {
6 String id = Cuid.createCuid();
7 System.out.println(id);
8 }
9}
10
1// C# (koristeći NuGet paket 'Cuid.Net')
2using Cuid;
3
4class Program
5{
6 static void Main(string[] args)
7 {
8 string id = CuidGenerator.Generate();
9 Console.WriteLine(id);
10 }
11}
12
1// PHP (koristeći paket 'endyjasmi/cuid')
2<?php
3require 'vendor/autoload.php';
4use Endyjasmi\Cuid\Cuid;
5
6$id = Cuid::make();
7echo $id;
8
1// Go (koristeći paket 'github.com/lucsky/cuid')
2package main
3
4import (
5 "fmt"
6 "github.com/lucsky/cuid"
7)
8
9func main() {
10 id := cuid.New()
11 fmt.Println(id)
12}
13
1// Swift (koristeći paket 'CUID')
2import CUID
3
4let id = CUID()
5print(id)
6
1// C++ (koristeći prilagođenu implementaciju)
2#include <iostream>
3#include <chrono>
4#include <random>
5#include <sstream>
6#include <iomanip>
7
8std::string generateCUID() {
9 auto now = std::chrono::system_clock::now();
10 auto now_ms = std::chrono::time_point_cast<std::chrono::milliseconds>(now);
11 auto value = now_ms.time_since_epoch();
12 long duration = value.count();
13
14 std::random_device rd;
15 std::mt19937 gen(rd());
16 std::uniform_int_distribution<> dis(0, 35);
17
18 std::stringstream ss;
19 ss << 'c';
20 ss << std::hex << std::setfill('0') << std::setw(8) << duration;
21 for (int i = 0; i < 8; i++) {
22 int r = dis(gen);
23 ss << (char)(r < 10 ? '0' + r : 'a' + r - 10);
24 }
25 return ss.str();
26}
27
28int main() {
29 std::string id = generateCUID();
30 std::cout << id << std::endl;
31 return 0;
32}
33
1% MATLAB (koristeći prilagođenu implementaciju)
2function id = generateCUID()
3 timestamp = dec2hex(round(posixtime(datetime('now'))*1000), 8);
4 random = '';
5 for i = 1:8
6 random = [random char(randi([48 57 97 122]))];
7 end
8 id = ['c' timestamp random];
9end
10
11% Upotreba
12id = generateCUID();
13disp(id);
14
1## R (koristeći prilagođenu implementaciju)
2library(lubridate)
3
4generate_cuid <- function() {
5 timestamp <- format(as.numeric(now()) * 1000, scientific = FALSE)
6 timestamp <- substr(timestamp, 1, 8)
7 random <- paste0(sample(c(0:9, letters[1:6]), 8, replace = TRUE), collapse = "")
8 paste0("c", timestamp, random)
9}
10
11## Upotreba
12id <- generate_cuid()
13print(id)
14
1' Excel VBA (koristeći prilagođenu implementaciju)
2Function GenerateCUID() As String
3 Dim timestamp As String
4 Dim random As String
5 Dim i As Integer
6
7 timestamp = Right("00000000" & Hex(CLng(CDbl(Now()) * 86400000)), 8)
8
9 For i = 1 To 8
10 random = random & Mid("0123456789abcdef", Int(Rnd() * 16) + 1, 1)
11 Next i
12
13 GenerateCUID = "c" & timestamp & random
14End Function
15
16' Upotreba u ćeliji
17'=GenerateCUID()
18
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:
- Prva implementacija CUID-a fokusirala se na jednostavnost i lakoću korišćenja.
- Kako je usvajanje raslo, zajednica je doprinela implementacijama u raznim programskim jezicima.
- 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.
- 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
- Zvanični CUID GitHub Repozitorij
- CUID2 Specifikacija
- Elliott, Eric. "Generisanje jedinstvenih ID-ova u distribuiranom okruženju." Medium, 2015.
- "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.
Povratne informacije
Kliknite na obaveštenje o povratnim informacijama da biste započeli davanje povratnih informacija o ovom alatu
Povezani alati
Otkrijte više alata koji bi mogli biti korisni za vaš radni tok