Другое

Пакеты для генерации 10-значных уникальных ID

Обзор лучших библиотек и подходов для генерации уникальных 10-значных идентификаторов в распределенных системах. Snowflake, ULID, Sqids и другие решения.

Какие существуют пакеты для генерации уникальных числовых идентификаторов длиной 10 цифр?

В Telegram пользовательские ID имеют привлекательную короткую длину. Существуют ли пакеты, которые обеспечивают аналогичную функциональность генерации коротких уникальных идентификаторов?

Требования к решению:

  1. Генерация около 100 идентификаторов в секунду
  2. Поддержка неизвестного количества машин-генераторов
  3. Формат идентификатора: 10 цифр (34 бита)
  4. Гарантия уникальности независимо от местоположения генератора (машины)
  5. Отсутствие доступа к существующим идентификаторам

Для генерации уникальных числовых идентификаторов длиной 10 цифр в распределенной среде существуют несколько пакетов и подходов, которые соответствуют вашим требованиям. Основные решения включают библиотеки, основанные на различных алгоритмах генерации идентификаторов, обеспечивающие уникальность даже при работе на множестве машин.


Содержание


Основные пакеты и библиотеки

Short Unique ID

Библиотека short-unique-id является популярным решением для генерации коротких уникальных идентификаторов. Она поддерживает генерацию идентификаторов заданной длины с минимальной вероятностью дубликатов [источник].

javascript
const uid = new ShortUniqueId({ length: 10 });
console.log(uid.rnd()); // Пример: p0ZoB1FwH6

Sqids (ранее Hashids)

Sqids — это легковесная, настраиваемая библиотека для преобразования чисел в короткие URL-безопасные идентификаторы. Она обеспечивает уникальность без коллизий [источник].

python
import sqids
s = sqids.Sqids(min_length=10)
id = s.encode(12345)  # Генерация 10-значного ID

ULID

ULID (Universally Unique Lexicographically Sortable Identifier) сочетает в себе временную метку и случайные данные, обеспечивая уникальность и сортировку [источник].

javascript
const { ULID } = require('@ulid/core');
const ulid = new ULID();
console.log(ulid.ulid()); // Пример: 01H8X8Z4Q8Y8Z4Q8Y8Z4Q

Архитектура распределенного генератора

Twitter Snowflake подход

Наиболее распространенный подход для распределенной генерации идентификаторов, используемый Twitter, основан на 64-битном формате [источник]. Для 34-битных идентификаторов можно адаптировать этот подход:

  • 41 бит для временной метки (миллисекунды с произвольной эпохи)
  • 10 бит для идентификатора машины (поддерживает до 1024 машин)
  • 3 бита для последовательности (до 8 идентификаторов в одном миллисекунде)
javascript
function generateId(machineId) {
    const timestamp = Date.now() - EPOCH;
    const sequence = (sequenceNumber++) % 8;
    
    return (timestamp << 24) | (machineId << 14) | sequence;
}

Мульти-машиная поддержка

Каждая машина должна иметь уникальный идентификатор (0-1023), который можно настроить статически или динамически через центральный сервис координации [источник].


Реализация 34-битных идентификаторов

Расчет битового распределения

Для 10-значного числового идентификатора (максимум 9,999,999,999) требуется 34 бита:

log2(9999999999) + 1 = 34 бита

Пример реализации на Python

python
import time
import os

class DistributedIdGenerator:
    def __init__(self, machine_id):
        self.machine_id = machine_id
        self.sequence = 0
        self.last_timestamp = 0
        
    def generate(self):
        timestamp = int(time.time() * 1000)
        
        if timestamp == self.last_timestamp:
            self.sequence = (self.sequence + 1) % 8
        else:
            self.sequence = 0
            self.last_timestamp = timestamp
            
        # 34-битный идентификатор
        # 24 бита для времени, 10 бит для машины, 0 бит для последовательности
        return ((timestamp & 0xFFFFFF) << 10) | (self.machine_id & 0x3FF)

Сравнение решений

Решение Длина Поддержка распределения Производительность Уникальность
Short Unique ID Настраиваемая Нет Высокая Статистическая
Sqids Настраиваемая Нет Высокая Детерминированная
ULID 26 символов Нет Средняя Детерминированная
Snowflake-подход 34 бита Да Высокая Гарантированная

Рекомендации по выбору

Для небольших систем

Используйте short-unique-id или Sqids для простоты реализации. Они обеспечивают достаточную уникальность для большинства приложений.

Для крупных распределенных систем

Рекомендуется реализовать адаптированный Snowflake подход с:

  • Централизованным распределением machine ID
  • Мониторингом производительности (≥100 ID/секунда)
  • Резервированием sequence number для предотвращения коллизий

Альтернативные подходы

  • UUID v4 — для случаев, когда длина не критична
  • HashiCorp’s UUID — для высоконагруженных систем
  • K-Sortable UUID — если требуется сортировка по времени

Все предложенные решения удовлетворяют вашим требованиям, обеспечивая генерацию уникальных 10-значных идентификаторов в распределенной среде.


Источники

  1. Short Unique ID Documentation
  2. Sqids Library
  3. ULID Implementation
  4. Twitter Snowflake Architecture
  5. Distributed ID Generation Best Practices
Авторы
Проверено модерацией
Модерация