Whiz Tools

Генератор ULID

Згенерований ULID:

Структура ULID


Часова мітка (10 символів)

Випадковість (16 символів)

Генератор ULID

Вступ

ULID (Універсальний Унікальний Лексикографічно Сортований Ідентифікатор) — це унікальний ідентифікатор, який поєднує в собі часову мітку з випадковими даними для створення рядка з 26 символів. ULID розроблені для того, щоб бути лексикографічно сортованими, зберігаючи при цьому високий ступінь унікальності та випадковості.

Структура ULID

ULID складається з двох основних частин:

  1. Часова мітка (10 символів): Перші 10 символів представляють час у мілісекундах з моменту Unix Epoch (1970-01-01).
  2. Випадковість (16 символів): Решта 16 символів генеруються за допомогою криптографічно безпечних випадкових даних.

Отриманий 26-символьний рядок кодується за допомогою алфавіту бази 32 Крокфорда (0-9 та A-Z, виключаючи I, L, O та U).

Формула

ULID генерується за допомогою наступних кроків:

  1. Згенерувати 48-бітну часову мітку (мілісекунди з моменту Unix Epoch).
  2. Згенерувати 80 біт криптографічно безпечних випадкових даних.
  3. Закодувати об'єднані 128 біт за допомогою кодування бази 32 Крокфорда.

Обчислення

Генератор ULID виконує наступні кроки:

  1. Отримати поточну часову мітку в мілісекундах.
  2. Згенерувати 10 випадкових байтів (80 біт) за допомогою криптографічно безпечного генератора випадкових чисел.
  3. Об'єднати часову мітку та випадкові дані в 128-бітне ціле число.
  4. Закодувати 128-бітне ціле число за допомогою кодування бази 32 Крокфорда.

Сценарії використання

ULID корисні в різних сценаріях, зокрема:

  1. Ключі бази даних: ULID можуть використовуватися як унікальні ідентифікатори для записів у базі даних, забезпечуючи унікальність і сортованість.
  2. Розподілені системи: У розподілених середовищах ULID можуть генеруватися без координації між вузлами.
  3. Логування та трасування: ULID можуть використовуватися для позначення записів журналу або трасування подій, надаючи сортований і унікальний ідентифікатор.
  4. URL-дружні ідентифікатори: ULID безпечні для URL і можуть використовуватися в веб-додатках як ідентифікатори в URL.

Альтернативи

Хоча ULID є універсальними, існують й інші системи унікальних ідентифікаторів, які варто розглянути:

  1. UUID (Універсальний Унікальний Ідентифікатор): 128-бітний ідентифікатор, який не містить компонента часової мітки.
  2. KSUID (K-Сортований Унікальний Ідентифікатор): Подібний до ULID, але з іншим кодуванням часової мітки.
  3. Snowflake ID: Система генерації розподілених унікальних ID від Twitter, яка включає часову мітку та ID робочого вузла.

Історія

ULID були представлені в 2016 році Алізаїном Феерастою як альтернатива UUID. Вони були розроблені для вирішення деяких обмежень UUID, особливо в термінах сортованості та читабельності. Специфікація ULID залишалася стабільною з моменту її впровадження, з різними реалізаціями, доступними на різних мовах програмування.

Приклади

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

// Реалізація на JavaScript
function generateULID() {
  const timestamp = Date.now().toString(36).padStart(10, '0');
  const randomness = crypto.getRandomValues(new Uint8Array(16))
    .reduce((acc, byte) => acc + byte.toString(36).padStart(2, '0'), '');
  return (timestamp + randomness).toUpperCase();
}

console.log(generateULID());
## Реалізація на Python
import time
import secrets
import base64

def generate_ulid():
    timestamp = int(time.time() * 1000).to_bytes(6, byteorder="big")
    randomness = secrets.token_bytes(10)
    return base64.b32encode(timestamp + randomness).decode("ascii").lower()

print(generate_ulid())
// Реалізація на Java
import java.security.SecureRandom;
import java.time.Instant;

public class ULIDGenerator {
    private static final SecureRandom random = new SecureRandom();
    private static final char[] ENCODING_CHARS = "0123456789ABCDEFGHJKMNPQRSTVWXYZ".toCharArray();

    public static String generateULID() {
        long timestamp = Instant.now().toEpochMilli();
        byte[] randomness = new byte[10];
        random.nextBytes(randomness);

        StringBuilder result = new StringBuilder();
        // Кодування часової мітки
        for (int i = 9; i >= 0; i--) {
            result.append(ENCODING_CHARS[(int) (timestamp % 32)]);
            timestamp /= 32;
        }
        // Кодування випадковості
        for (byte b : randomness) {
            result.append(ENCODING_CHARS[b & 31]);
        }
        return result.toString();
    }

    public static void main(String[] args) {
        System.out.println(generateULID());
    }
}

Ці приклади демонструють, як генерувати ULID на JavaScript, Python і Java. Ви можете адаптувати ці функції під свої специфічні потреби або інтегрувати їх у більші системи, які потребують унікальних ідентифікаторів.

Посилання

  1. "Специфікація ULID." GitHub, https://github.com/ulid/spec. Доступно 2 серпня 2024 року.
  2. "Кодування бази 32 Крокфорда." Кодування бази 32, http://www.crockford.com/base32.html. Доступно 2 серпня 2024 року.
  3. "UUID проти ULID." Stack Overflow, https://stackoverflow.com/questions/54222235/uuid-vs-ulid. Доступно 2 серпня 2024 року.
Зворотній зв'язок