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 включают:

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

Примеры кода

Вот примеры генерации 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# (с использованием пакета 'Cuid.Net' NuGet)
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 была вызвана необходимостью создать простую, устойчивую к коллизиям систему идентификации, которая могла бы работать на разных языках программирования и в разных средах. Целью Эллиота было создать систему, которая была бы проста в реализации, не требовала центральной координации и могла бы масштабироваться горизонтально.

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

  1. Исходная реализация CUID была сосредоточена на простоте и удобстве использования.
  2. По мере роста популярности сообщество внесло свои реализации на различных языках программирования.
  3. В 2021 году была представлена CUID2, чтобы устранить некоторые ограничения оригинального CUID и обеспечить еще лучшую производительность и устойчивость к коллизиям.
  4. CUID2 улучшила оригинал, используя более безопасный генератор случайных чисел и увеличив общую длину идентификатора.

Эволюция CUID отражает изменяющиеся потребности распределенных систем и постоянные усилия по балансировке простоты, безопасности и производительности в генерации уникальных идентификаторов.

Ссылки

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

Этот инструмент генерации CUID позволяет вам быстро генерировать CUID для ваших проектов. Просто нажмите кнопку "Сгенерировать", чтобы создать новый CUID, и используйте кнопку "Копировать", чтобы скопировать его в буфер обмена для удобного использования в ваших приложениях.

Feedback