1001Ferramentas
❄️Dev

Parser de Snowflake ID

Decompõe um snowflake (Twitter, Discord) em timestamp, worker ID, datacenter ID e sequence. Mostra a data legível.

Snowflake ID: 64 bits com hora, máquina e sequência

O Twitter criou o formato em 2010 ao sair do identificador auto-incremento do MySQL: com vários bancos, ninguém pode ser a autoridade única que distribui o próximo número. A solução foi montar o identificador a partir de três partes que cada máquina consegue preencher sozinha — o relógio, o número dela e um contador local.

O arranjo é fixo: um bit de sinal sempre zero, 41 bits de milissegundos contados de uma época escolhida pelo projeto, 10 bits de identificação da máquina e 12 bits de sequência. Os 12 bits de sequência limitam a 4096 identificadores por milissegundo por máquina, o que na prática nunca aperta. Os 41 bits de tempo é que definem a validade do esquema: dão cerca de 69 anos a partir da época.

A época é o que muda entre implementações, e é por isso que a página deixa escolher: o Twitter usa 4 de novembro de 2010, o Discord 1º de janeiro de 2015. Aplicar a época errada não gera erro — devolve uma data plausível e errada por anos. Vale notar também que a ordenação por identificador ordena por tempo, o que é metade do motivo do formato existir.

Perguntas frequentes

Por que o Twitter manda o ID como texto no JSON?
Porque JavaScript representa número em ponto flutuante de dupla precisão, que só guarda inteiro exato até 2 elevado a 53. Um Snowflake usa 63 bits, então o valor chega arredondado e aponta para outro registro. Por isso a API traz o campo em versão string além da numérica — e é a string que se deve usar.
O que acontece se o relógio da máquina voltar?
A implementação original recusa gerar até o relógio passar do último instante usado, porque emitir com tempo menor quebraria a ordenação e poderia repetir identificador já emitido. É a fraqueza estrutural do formato: ele depende de relógio monotônico, e ajuste de horário é evento real em servidor.
Snowflake ou UUID v7?
Fazem a mesma coisa por caminhos diferentes. Snowflake cabe em 64 bits, o que é metade do UUID e ainda entra num inteiro de banco — mas exige coordenar a atribuição do número de máquina. UUID v7 tem 128 bits e dispensa coordenação, porque o resto é aleatório. Sem infraestrutura para distribuir número de nó, v7 dá menos trabalho.

Ferramentas Relacionadas