Whiz Tools

Генератор CUID

Швидко та легко генеруйте ідентифікатор, стійкий до колізій.

Структура CUID

Часова мітка:

Випадковий:

Генератор CUID

Вступ

CUID (Collision-resistant Unique IDentifier) — це унікальний ідентифікатор, розроблений для того, щоб бути стійким до колізій, горизонтально масштабованим і послідовно сортуємим. CUID особливо корисні в розподілених системах, де потрібно генерувати унікальні ідентифікатори без координації між вузлами.

Структура CUID

CUID зазвичай складається з таких компонентів:

  1. Часова мітка: Представлення поточного часу
  2. Лічильник: Послідовний лічильник для забезпечення унікальності в межах тієї ж мілісекунди
  3. Відбиток клієнта: Унікальний ідентифікатор для машини або процесу, що генерує CUID
  4. Випадковий компонент: Додаткові випадкові дані для подальшого зменшення ймовірності колізії

Точна структура може варіюватися в залежності від реалізації CUID, але ці компоненти працюють разом, щоб створити унікальний та сортуємий ідентифікатор.

Ось візуальне представлення типової структури CUID:

Часова мітка Лічильник Відбиток Випадковий

Як генеруються CUID

CUID генеруються за допомогою комбінації часових та випадкових компонентів. Процес зазвичай включає:

  1. Отримання поточної часової мітки
  2. Інкрементування лічильника (який перезавантажується періодично)
  3. Генерацію відбитка клієнта (зазвичай виконується один раз за сесію або запуск програми)
  4. Додавання випадкових даних
  5. Комбінування цих елементів у специфічному форматі

Отриманий CUID зазвичай представляється у вигляді рядка літер і цифр.

Переваги та випадки використання

CUID пропонують кілька переваг у порівнянні з іншими системами унікальних ідентифікаторів:

  1. Стійкість до колізій: Комбінація часової мітки, лічильника та випадкових даних робить колізії вкрай малоймовірними, навіть у розподілених системах.
  2. Горизонтальна масштабованість: CUID можуть генеруватися незалежно на кількох машинах без координації.
  3. Послідовне сортування: Компонент часової мітки дозволяє хронологічно сортувати CUID.
  4. Дружні до URL: CUID зазвичай складаються з символів, безпечних для URL.

Звичайні випадки використання CUID включають:

  • Первинні ключі бази даних
  • Розподілені системи, де потрібно генерувати унікальні ID на кількох вузлах
  • ID сесій у веб-додатках
  • Відстеження подій у системах аналітики
  • Іменування файлів або ресурсів у системах хмарного зберігання

Приклади коду

Ось приклади генерації CUID на різних мовах програмування:

// JavaScript (використовуючи бібліотеку 'cuid')
const cuid = require('cuid');
const id = cuid();
console.log(id);
## Python (використовуючи бібліотеку 'cuid')
import cuid
id = cuid.cuid()
print(id)
## Ruby (використовуючи гем 'cuid')
require 'cuid'
id = Cuid::generate
puts id
// Java (використовуючи бібліотеку '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# (використовуючи пакет NuGet 'Cuid.Net')
using Cuid;

class Program
{
    static void Main(string[] args)
    {
        string id = CuidGenerator.Generate();
        Console.WriteLine(id);
    }
}
// PHP (використовуючи пакет 'endyjasmi/cuid')
<?php
require 'vendor/autoload.php';
use Endyjasmi\Cuid\Cuid;

$id = Cuid::make();
echo $id;
// Go (використовуючи пакет 'github.com/lucsky/cuid')
package main

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

func main() {
    id := cuid.New()
    fmt.Println(id)
}
// Swift (використовуючи пакет 'CUID')
import CUID

let id = CUID()
print(id)
// C++ (використовуючи власну реалізацію)
#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 (використовуючи власну реалізацію)
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

% Використання
id = generateCUID();
disp(id);
## R (використовуючи власну реалізацію)
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)
}

## Використання
id <- generate_cuid()
print(id)
' Excel VBA (використовуючи власну реалізацію)
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

' Використання в клітинці
'=GenerateCUID()

Історія та розвиток

CUID були спочатку розроблені Еріком Елліотом у 2012 році як рішення проблеми генерації унікальних ідентифікаторів у розподілених системах. Концепція була натхненна системою ідентифікаторів Snowflake від Twitter, але розроблена для більш простого впровадження та використання на різних платформах.

Розвиток CUID був зумовлений необхідністю простого, стійкого до колізій ID-системи, яка могла б працювати на різних мовах програмування та в різних середовищах. Метою Елліота було створити систему, яка була б легкою у впровадженні, не вимагала центральної координації та могла б горизонтально масштабуватися.

З моменту свого виникнення CUID пройшли кілька ітерацій та покращень:

  1. Оригінальна реалізація CUID зосереджувалася на простоті та зручності використання.
  2. З ростом популярності спільнота внесла реалізації на різних мовах програмування.
  3. У 2021 році була представлена CUID2, щоб усунути деякі обмеження оригінального CUID та забезпечити ще кращу продуктивність і стійкість до колізій.
  4. CUID2 покращила оригінал, використовуючи більш безпечний генератор випадкових чисел і збільшуючи загальну довжину ідентифікатора.

Еволюція CUID відображає змінювані потреби розподілених систем і постійні зусилля з балансування простоти, безпеки та продуктивності в генерації унікальних ідентифікаторів.

Посилання

  1. Офіційний репозиторій CUID на GitHub
  2. Специфікація CUID2
  3. Елліот, Ерік. "Генерація унікальних ID в розподіленому середовищі." Medium, 2015.
  4. "Стійкі до колізій ID для розподілених систем." DZone, 2018.

Цей інструмент генерації CUID дозволяє швидко генерувати CUID для ваших проектів. Просто натисніть кнопку "Генерувати", щоб створити новий CUID, і використовуйте кнопку "Копіювати", щоб скопіювати його в буфер обміну для легкого використання у ваших додатках.

Feedback