App下載

獨(dú)一無二:探秘生成唯一ID的神奇方法

退役魔法少女 2024-03-31 09:02:02 瀏覽數(shù) (1299)
反饋

在互聯(lián)網(wǎng),唯一ID的生成是一項(xiàng)關(guān)鍵任務(wù),用于標(biāo)識(shí)和區(qū)分各種實(shí)體,如用戶、訂單、產(chǎn)品等。本文將詳細(xì)介紹互聯(lián)網(wǎng)常用的唯一ID生成方式,包括自增ID、UUID、雪花算法等,并探討它們的特點(diǎn)和適用場(chǎng)景。

自增ID

自增ID是一種簡(jiǎn)單而常見的唯一ID生成方式,通過數(shù)據(jù)庫的自增字段實(shí)現(xiàn)。每次插入新記錄時(shí),自動(dòng)遞增生成唯一ID。這種方式簡(jiǎn)單高效,適用于單體應(yīng)用或小規(guī)模系統(tǒng)。示例代碼(使用MySQL):

CREATE TABLE users (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(100)
);

INSERT INTO users (name) VALUES ('John');
INSERT INTO users (name) VALUES ('Jane');

自增ID的優(yōu)點(diǎn)是易于實(shí)施和管理,但在分布式系統(tǒng)或多個(gè)數(shù)據(jù)庫實(shí)例中可能存在沖突的風(fēng)險(xiǎn)。

UUID

UUID(Universally Unique Identifier)是一種標(biāo)準(zhǔn)化的唯一ID生成方式,通過算法生成128位的字符串。UUID保證了在全球范圍內(nèi)的唯一性,不依賴于中央控制機(jī)構(gòu)。

asset_A4WDXnNV

在Python中,可以使用uuid庫生成UUID。示例代碼:

import uuid

uid = uuid.uuid4()
print(uid)

UUID的優(yōu)點(diǎn)是全局唯一,無需依賴數(shù)據(jù)庫自增或其他機(jī)制,適用于分布式系統(tǒng)。然而,UUID的字符串較長(zhǎng),不適合作為數(shù)據(jù)庫索引或URL中的參數(shù)。

雪花算法

雪花算法(Snowflake)是Twitter開源的一種分布式唯一ID生成算法。它將唯一ID分為不同的部分,包括時(shí)間戳、機(jī)器ID和序列號(hào)。這些部分的組合保證了生成的唯一ID在分布式系統(tǒng)中的唯一性和有序性。

Snowflake-identifier

示例代碼(使用Python實(shí)現(xiàn)):

import time

class Snowflake:
    def __init__(self, worker_id):
        self.worker_id = worker_id
        self.sequence = 0
        self.last_timestamp = -1

    def generate_id(self):
        timestamp = int(time.time() * 1000)

        if timestamp < self.last_timestamp:
            raise Exception("Clock moved backwards!")

        if timestamp == self.last_timestamp:
            self.sequence = (self.sequence + 1) & 4095
            if self.sequence == 0:
                timestamp = self.wait_next_millis(self.last_timestamp)
        else:
            self.sequence = 0

        self.last_timestamp = timestamp

        # 生成ID
        unique_id = ((timestamp - 1420041600000) << 22) | (self.worker_id << 12) | self.sequence
        return unique_id

    def wait_next_millis(self, last_timestamp):
        timestamp = int(time.time() * 1000)
        while timestamp <= last_timestamp:
            timestamp = int(time.time() * 1000)
        return timestamp

# 使用示例
snowflake = Snowflake(worker_id=1)
unique_id = snowflake.generate_id()
print(unique_id)

雪花算法的優(yōu)點(diǎn)是在分布式系統(tǒng)中生成唯一ID,且具有有序性。它的缺點(diǎn)是依賴于系統(tǒng)時(shí)鐘的準(zhǔn)確性,同時(shí)需要分配和管理機(jī)器ID。

總結(jié)

唯一ID的生成方式多種多樣,每種方式都有自己的特點(diǎn)和適用場(chǎng)景。自增ID適用于單體應(yīng)用或小規(guī)模系統(tǒng),UUID適用于分布式系統(tǒng),而雪花算法適用于需要分布式、有序、高性能的場(chǎng)景。開發(fā)者可以根據(jù)實(shí)際需求選擇合適的唯一ID生成方式,確保在互聯(lián)網(wǎng)應(yīng)用中實(shí)現(xiàn)唯一性標(biāo)識(shí)和數(shù)據(jù)完整性。

0 人點(diǎn)贊