Snowflake IDs are used in distributed environments to generate collision-free, short, unique IDs. Unlike traditional methods, such as relying on a database for ID generation or using a long 128-bit UUID, Snowflake IDs use time and simple bitwise operations. This clever technique allows each microservice to generate unique IDs independently, without needing a central system to avoid collisions.
Generating a Snowflake ID is like building a puzzle with three key pieces. Let’s break it down:
Take an n-bit long bit string:
First, we start with a bit string of length n. This will hold all the necessary information to generate a unique ID.
Divide it into three sections: i, j, and k:
The bit string is divided into three parts, such that i j k = n.
i - The Time Component:
The first part, i, represents the current time. Choose a fixed start time (also known as the epoch), and the bits of i will be calculated by taking the current time in nanoseconds and subtracting the start time. This ensures that newer IDs are always larger than older ones.
j - The Machine ID:
The second part, j, is the machine identifier. When your microservice starts, it is assigned a unique ID (machine ID), which becomes the j part. This ensures that IDs generated by different machines won’t collide, even if they are created at the exact same moment.
k - The Sequence Number:
The last part, k, is the sequence number. It acts like a counter that increments whenever multiple IDs are generated within the same time unit. This keeps IDs unique, even if they are generated in rapid succession.
Think of a Snowflake ID as a special dish tag in a busy kitchen:
Check this GitHub repo for a Go implementation of Snowflake ID generation
Disclaimer: All resources provided are partly from the Internet. If there is any infringement of your copyright or other rights and interests, please explain the detailed reasons and provide proof of copyright or rights and interests and then send it to the email: [email protected] We will handle it for you as soon as possible.
Copyright© 2022 湘ICP备2022001581号-3