Skip to content

Feature Sonyflake

github-actions[bot] edited this page Jul 15, 2026 · 1 revision

🎌 Sonyflake

← Возможности · Главная · Сравнение

Альтернатива Snowflake от Sony: 39 бит десятимиллисекундных тиков, 8 бит последовательности, 16 бит машины. Меньше плотность генерации (256 за 10 мс), зато 174 года жизни и 65 536 машин.

Принцип работы

use CloudCastle\Uuid\SonyflakeFactory;

$factory = new SonyflakeFactory(machineId: 1234);

$id = $factory->generate();
$id->toInt();          // BIGINT
$id->machineId();      // 1234
$id->sequence();       // 0..255 в пределах тика
$id->dateTime();       // момент (гранулярность 10 мс)

$factory->parse($чужойId);   // разбор на поля

Эпоха по умолчанию — 2014-09-01 UTC (как в оригинальном Go-Sonyflake), настраивается. Края — как у Snowflake: перенос в следующий тик без сна, откат часов — исключение.

Плюсы

  • 65 536 машин без иерархии датацентров — проще раздавать идентификаторы узлов.
  • Горизонт 174 года против 69 у Snowflake.

Минусы

  • 256 идентификаторов на 10 мс на машину — для сверхплотной генерации берите Snowflake.

✅ Рекомендуется

  • Большие парки мелких сервисов/устройств с умеренной частотой генерации.

❌ Антипаттерны

  • Пиковые вставки >25 600/с с одной машины — упрётесь в плотность тика.

Схема фичи

flowchart LR
    C["Часы"] -->|"39 бит тиков по 10 мс"| F[SonyflakeFactory]
    M["machine 0..65535"] --> F
    F -->|"sequence 8 бит"| ID["SonyflakeId (63 бита)"]
Loading

Жизненный цикл

sequenceDiagram
    participant A as Приложение
    participant F as SonyflakeFactory

    A->>F: generate()
    F->>F: тик = мс от эпохи / 10
    F->>F: тот же тик? → sequence + 1 (256 → тик + 1)
    F-->>A: SonyflakeId
Loading

Сравнение с аналогами

Возможность Uuid godruoyi/php-snowflake 🏆 Победитель
Раскладка Sony 39/8/16 Паритет
Разбор на поля ⚠️ Uuid
Отдельный типизированный VO Uuid
PSR-20 часы ⚠️ Uuid

Clone this wiki locally