Перейти к содержимому

Snowflake-идентификаторы

Все ID во Флудилке (пользователи, гильдии, каналы, сообщения, роли и т.д.) — это snowflake: 64-битные целые числа, упакованные в одну строку.

1496956937664585746
└─ snowflake, ID бот-пользователя

В JSON snowflake всегда приходит строкой, а не числом — 64-битные целые не помещаются в Number в JavaScript без потери точности. Работайте с ними через BigInt или как со строкой.

0b ┌──────────── 42 бита ────────────┐┌ 10 бит ┐┌ 12 бит ┐
│ TIMESTAMP ││ NODE ││ SEQ │
└────────────────────────────────┘└────────┘└────────┘
63 22 21 12 11 0
Диапазон битовПолеЗначение
63–22 (42 бита)timestampМиллисекунды с Floodilka-эпохи (2015-01-01T00:00:00.000Z = 1420070400000)
21–12 (10 бит)node_idID инстанса бэкенда, сгенерировавшего snowflake (0..1023)
11–0 (12 бит)sequenceСчётчик в пределах миллисекунды (0..4095), растёт при одновременных запросах

Один инстанс может безопасно выдать до 4096 ID в миллисекунду. При переполнении счётчика — инстанс ждёт следующей миллисекунды.

Snowflake содержит точный timestamp. Это удобно — например, можно получить дату создания пользователя без отдельного запроса:

const FLOODILKA_EPOCH = 1420070400000n;
function snowflakeToDate(snowflake) {
const id = BigInt(snowflake);
const ms = (id >> 22n) + FLOODILKA_EPOCH;
return new Date(Number(ms));
}
snowflakeToDate('1496956937664585746'); // Date: 2026-04-23T...

Snowflake монотонно растут по времени. Это значит:

  • Больший snowflake = более позднее создание (в пределах кластера)
  • Сортировка ID по возрастанию = сортировка по времени создания
  • Сравнивайте snowflake как BigInt — лексикографическое сравнение строк надёжно только при одинаковой длине

Заголовок X-RateLimit-Reset в ответе API — это unix-timestamp в секундах, не snowflake. Путать их легко, но формат разный.