From 2ff587925bd58406283524fbaa7a24fd45c38cb1 Mon Sep 17 00:00:00 2001 From: Ryan Yin Date: Thu, 7 Dec 2023 18:07:53 +0800 Subject: [PATCH] feat: uid generator --- .../distributed-unique-id-algorithms.webp | Bin 0 -> 93056 bytes ...37\346\210\220\347\256\227\346\263\225.md" | 173 ++++++++++++++++++ 2 files changed, 173 insertions(+) create mode 100644 algorithm/_img/distributed-unique-id-algorithms.webp create mode 100644 "algorithm/\345\224\257\344\270\200 ID \347\224\237\346\210\220\347\256\227\346\263\225.md" diff --git a/algorithm/_img/distributed-unique-id-algorithms.webp b/algorithm/_img/distributed-unique-id-algorithms.webp new file mode 100644 index 0000000000000000000000000000000000000000..b47b140a0e45fe815ede9a6c318a63c3441fdf35 GIT binary patch literal 93056 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
    +XU1F(s3zIb&&&py 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 literal 0 HcmV?d00001 diff --git "a/algorithm/\345\224\257\344\270\200 ID \347\224\237\346\210\220\347\256\227\346\263\225.md" "b/algorithm/\345\224\257\344\270\200 ID \347\224\237\346\210\220\347\256\227\346\263\225.md" new file mode 100644 index 00000000..026af5d1 --- /dev/null +++ "b/algorithm/\345\224\257\344\270\200 ID \347\224\237\346\210\220\347\256\227\346\263\225.md" @@ -0,0 +1,173 @@ +# 唯一 ID 生成算法 + + +## 结构说明 + +![](./_img/distributed-unique-id-algorithms.webp) + +## 1. UUID + +When talking about generating unique IDs, UUIDs or Universal Unique Identifiers come to mind. + +A UUID is made of 32 hexadecimal characters. Remember, each character is 4 bits. So, all in all, it’s 128 bits. And when you include the 4 hyphens, you’ll see 36 characters: + +``` +6e965784–98ef-4ebf-b477–8bd14164aaa4 + +5fd6c336-48c4-4510-bfe5-f7928a83a3e2 + +0333be18-5ecc-4d7e-98d4-80cc362e4ade +``` + +There are 5 common types of UUID: + +* **Version 1 — Time-based MAC**: This UUID uses the MAC Address of your computer and the current time. +* **Version 2 — DCE Security**: Similar to Version 1 but with extra info like POSIX UID or GID. +* **Version 3 — Name-based MD5**: This one takes a namespace and a string, then uses MD5 to create the UUID. +* **Version 4 — Randomness**: Every character is chosen randomly. +* **Version 5 — Name-based SHA1**: Think of Version 3, but instead of MD5, it uses SHA-1. +* …You may want to consider other drafts like Version 6 - Reordered Time and Version 7 - Unix Epoch Time, etc, among the latest proposals at ramsey/uuid. + +I won’t go into the details of each version right now. But if you’re unsure about which to choose, I’ve found **Version 4 — Randomness** to be a good starting point. It’s straightforward and effective. + +> “Random and unique? How’s that even possible?” + +The magic lies in its super low chance of collision. + +Pulling from Wikipedia, imagine generating 1 billion UUIDs every second for 86 whole years and only then would you have a 50% chance of getting a single match. + + “Why do some say UUID has only 122 bits when it’s clearly 128 bits?” + +When people talk about UUIDs, they often refer to the most common type, which is variant 1, version 4. + +In this type, 6 out of the 128 bits are already set for specific purposes: 4 bits tell us it’s version 4 (or “v4”), and 2 bits are reserved for variant information. + +So, only 122 bits are left to be filled in randomly. +Pros + +* It’s simple, there’s no need for initial setups or a centralized system to manage the ID. +* Every service in your distributed system can roll out its own unique ID, no chit-chat needed. + +Cons + +* With 128 bits, it’s a long ID and it’s not something you’d easily write down or remember. +* It doesn’t reveal much information about itself. +* UUIDs aren’t sortable (except for versions 1 and 2). + +## 2. NanoID + +Drawing from the concept of UUID, NanoID streamlines things a bit with just 21 characters but these characters are sourced from an alphabet of 64 characters, inclusive of hyphens and underscores. + +Doing the math, each NanoID character takes up 6 bits, as opposed to the 4 bits of UUID and a quick multiplication, and we see NanoID coming in at a neat 126 bits. + +``` +NUp3FRBx-27u1kf1rmOxn +XytMg-01fzdSaHoKXnPMJ +_4hP-0rh8pNbx6-Qw1pMl + +``` + +> “Does storing NanoID vs. UUID in a database make much of a difference?” + +Well, if you’re saving them as strings, NanoID might be a bit more efficient, being 15 characters shorter than UUID, but in their binary forms, the difference is a mere 2 bits, often a minor detail in most storage scenarios. + +Pros + +* NanoID uses characters (A-Za-z0–9_-) which is friendly with URLs. +* At just 21 characters, it’s more compact than UUID, shaving off 15 characters to be precise (though it’s 126 bits versus UUID’s 128) + +Cons + +* NanoID is newer and might not be as widely supported as UUID. + +## 3. ObjectID(MongoDB 96Bits) + +ObjectID is MongoDB’s answer to a unique document ID, this 12-byte identifier typically resides in the “_id” field of a document, and if you’re not setting it yourself, MongoDB steps in to do it for you. + +Here’s what makes up an ObjectID: + +* Timestamp (4 bytes): This represents the time the object was created, measured from the Unix epoch (a timestamp from 1970, for those who might need a refresher). +* Random Value (5 bytes): Each machine or process gets its own random value. +* Counter (3 bytes): A simple incrementing counter for a given machine + +> “But how does each process ensure its random value is unique?” + +With 5 bytes, we’re talking about 2⁴⁰ potential values, given the limited number of machines or processes, collisions are exceedingly rare +ObjectID (source: blog.devtrovert.com) + +When representing ObjectIDs, MongoDB goes with hexadecimal, turning those 12 bytes (or 96 bits) into 24 characters + +``` +6502b4ab cf09f864b0 074858 +6502b4ab cf09f864b0 074859 +6502b4ab cf09f864b0 07485a +``` + +Pros + +* Ensures a global order without needing a centralized authority to oversee uniqueness +* In terms of byte size, it’s more compact than both UUID and NanoID. +* Using IDs for sorting is straightforward, and you can easily see when each object was made. +* Reveals the specific process or machine that created an item. +* Scales gracefully, thanks to its time-based structure ensuring no future conflicts. + +Cons + +* Despite its relative compactness, 96 bits can still be considered long. +* Be careful when sharing ObjectIDs with clients, they might reveal too much. + + +## 4. Snowflake(64 Bits) + +Twitter Snowflake (64 bits) + +Commonly known as “Snowflake ID”, this system was developed by Twitter to efficiently generate IDs for their massive user base. + +Also, a Snowflake ID boils down to a 64-bit integer, which is more compact than MongoDB’s ObjectID + +* Sign Bit (1 bit): This bit is typically unused, though it can be reserved for specific functions. +* Timestamp (41 bits): Much like ObjectID, it represents data creation time in milliseconds, spanning ~70 years from its starting point. +* Datacenter ID (5 bits): Identifies the physical datacenter location. With 5 bits, we can have up to 2⁵ = 32 datacenter. +* Machine/ Process ID (5 bits): Tied to individual machines, services, or processes creating data. +* Sequence (12 bits): An incrementing counter that resets to 0 every millisecond. + + +> “Hold on. 70 years? So from 1970, it’s done by 2040?” + +Exactly. + +Many Snowflake implementations use a custom epoch that begins more recently, like Nov 04 2010 01:42:54 UTC, for instance. As for its advantages, they’re pretty evident given the design. + +Cons + +* Might be over-engineered for medium-sized businesses, especially with complex setups like multiple data centers, millisecond-level timestamps, sequence resets... +* Limited lifespan, it has a lifespan of ~70 years. + +It packs features some may find excessive, but for giants like Twitter, it’s right on the money. + + +## 性能测试 + +https://github.com/knifecake/python-id-benchmarks + +测试结果(时间单位为 ns): + +``` +----------------- benchmark 'test_generate': 7 tests ----------------- +Name (time in ns) Mean StdDev +---------------------------------------------------------------------- +generate[snowflake] 492.1435 (1.0) 46.7127 (1.0) +generate[cyksuid] 695.9376 (1.41) 119.0593 (2.55) +generate[python-ulid] 1,719.8319 (3.49) 240.3840 (5.15) +generate[uuid4] 1,961.3799 (3.99) 119.5277 (2.56) +generate[timeflake] 2,637.3506 (5.36) 451.9482 (9.68) +generate[svix] 3,746.8204 (7.61) 685.0287 (14.66) +generate[cuid2] 317,832.6200 (645.81) 4,876.3859 (104.39) +---------------------------------------------------------------------- +``` + +结论: + +1. snowflake 是其中最快的算法,但是它的缺点是依赖于时钟,如果时钟回拨,会导致 ID 重复。 +2. python 标准库中的 uuid4 用时是 snowflake 的 400%,也即它比 snowflake 慢了 300%,它甚至还是 C 语言实现的!而 snowflake 是纯 python. +