首頁  >  文章  >  後端開發  >  了解 UUID:初級開發人員後端工程師指南

了解 UUID:初級開發人員後端工程師指南

DDD
DDD原創
2024-09-18 17:37:03859瀏覽

Understanding UUIDs: A Backend Engineer’s Guide for Junior Developers

介紹

身為後端工程師,我們經常負責建立可以擴展和處理大量資源、使用者和實體的系統,每個資源、使用者和實體都需要唯一的識別。在許多情況下,使用順序 ID(例如 1、2、3)似乎是一個簡單的解決方案,但隨著應用程式在分散式系統中成長和擴展,這很快就會成為問題。這就是UUID(通用唯一識別碼)發揮作用的地方。

在這篇文章中,我們將探討:

  • 什麼是 UUID
  • UUID 的真實用例
  • 如何在 Python 中實作 UUID
  • 忽略 UUID 的風險
  • 使用 UUID 時的常見錯誤
  • 使用 UUID 的最佳實務

什麼是UUID?

UUID(通用唯一識別碼)是一個 128 位元數字,用於唯一標識電腦系統中的資訊。它被設計為全域唯一,這意味著在不同系統中獨立產生的 UUID 不會發生衝突。

UUID 如下:

66e69275-c6bc-800c-90a6-2f41cb991502

由 32 個十六進位數字組成,分五組顯示,以連字號分隔,格式為 8-4-4-4-12。

UUID 的實際用例

  1. 分散式系統中的資料庫金鑰:在不同資料庫或微服務需要產生唯一ID而不互相通訊的系統中,UUID確保唯一性。例如,在分散式電子商務平台中,每個服務可能獨立產生訂單或交易 ID,UUID 將避免任何衝突。

  2. 會話 ID:UUID 通常用於識別 Web 應用程式中的使用者會話。當您需要維護會話資訊而不洩露敏感或可預測資料時,它們特別有用。

  3. 文件或資源識別碼:當您需要跨不同平台或資料庫追蹤文件、文件或任何資源時,可以為每個資源分配一個UUID,以便於查找,而無需擔心重複。

  4. API 和外部引用:在 API 中暴露連續或容易猜測的 ID(例如 user/1、user/2)可能會導致隱私漏洞。透過使用 UUID(例如 user/66e69275-c6bc-800c-90a6-2f41cb991502),您可以減少使用者猜測和存取不屬於他們的資源的可能性。

在 Python 中實作 UUID

Python 的 uuid 函式庫讓產生和管理 UUID 變得簡單。方法如下:

import uuid

# Generate a UUID
generated_uuid = uuid.uuid4()
print(f"Generated UUID: {generated_uuid}")

uuid4() 函數根據隨機或偽隨機數產生隨機 UUID,這是 Web 開發中最常見的變體。

範例:使用 UUID 作為資料庫中的主鍵

使用 PostgreSQL 等資料庫時,通常會使用 UUID 作為主鍵。以下是如何使用 SQLAlchemy 在 Python 中進行設定:

from sqlalchemy import Column, String
from sqlalchemy.dialects.postgresql import UUID
import uuid
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class User(Base):
    __tablename__ = 'users'

    id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4, unique=True, nullable=False)
    username = Column(String, nullable=False)

# This will generate a UUID primary key for each new user.

在此範例中,我們將 id 欄位定義為 UUID,確保每個使用者都有一個唯一的標識符,即使跨分散式資料庫,也不會與其他記錄衝突。

忽略 UUID 的風險

忽略 UUID 而選擇順序或自動遞增 ID 可能會帶來多種風險:

  1. 安全漏洞:序列 ID 是可預測的,使攻擊者可以輕鬆枚舉記錄並發現敏感資料。例如,如果使用者 ID 是連續的,攻擊者可能會嘗試猜測其他使用者 ID 並存取未經授權的帳戶。

  2. 資料衝突:在分散式系統中,依賴自增整數可能會導致 ID 衝突,特別是當多個服務或資料庫在沒有中央協調的情況下產生 ID 時。

  3. 資料遷移和合併問題:當組合資料庫或跨系統遷移資料時,具有非唯一的順序 ID 可能會導致衝突。 UUID 透過保證唯一性來避免這些問題。

使用 UUID 時的常見錯誤

  1. 將 UUID 儲存為字串:一個常見的錯誤是將 UUID 儲存為字串,這會浪費空間並降低查詢速度,尤其是在大型資料庫中。大多數現代資料庫(例如 PostgreSQL)都具有可有效儲存 UUID 的本機 UUID 類型。

    錯誤

    CREATE TABLE users (
        id VARCHAR(36) PRIMARY KEY
    );
    


    CREATE TABLE users (
        id UUID PRIMARY KEY
    );
    
  2. Not Using the Correct UUID Version: There are several versions of UUIDs (e.g., uuid1(), uuid3(), uuid4(), uuid5()), each suited to specific use cases. uuid4(), based on random numbers, is the most commonly used for generating unique IDs in web applications. Be mindful of which version you’re using and whether it fits your needs.

  3. Ignoring Collision Possibilities: While UUIDs are designed to be unique, there’s a very small chance of collision. For most applications, the risk is negligible, but if you’re generating billions of UUIDs or operating in highly sensitive environments, you should implement collision detection.

Best Practices for Using UUIDs

  1. Use UUIDs for External References: When exposing IDs in URLs or APIs, prefer UUIDs to sequential IDs. This enhances security and makes it harder for users to predict resource IDs.

  2. Store UUIDs in Native Formats: Use the database's native UUID type to store UUIDs instead of strings. This reduces storage space and improves query performance.

  3. Choose the Right UUID Version: In most cases, uuid4() (random-based UUID) is the best choice for generating unique identifiers in web applications. However, if you need deterministically generated UUIDs, you might consider uuid3() or uuid5() (namespace-based UUIDs).

  4. Validate UUIDs: When accepting UUIDs from user input, always validate them to ensure they are properly formatted before processing. In Python, you can use UUID objects to check the validity of a string.

def is_valid_uuid(uuid_to_test, version=4):
    try:
        uuid_obj = uuid.UUID(uuid_to_test, version=version)
        return str(uuid_obj) == uuid_to_test
    except ValueError:
        return False

# Example usage
print(is_valid_uuid("66e69275-c6bc-800c-90a6-2f41cb991502"))  # True
print(is_valid_uuid("invalid-uuid-string"))  # False

Conclusion

UUIDs are powerful tools for generating unique identifiers in distributed systems and ensuring security in web applications. They help you avoid issues like data collisions, predictable ID attacks, and ID conflicts during database migrations. By understanding and following best practices for UUIDs, you can build more robust, scalable, and secure backend systems.

Remember to use the appropriate UUID version, store them correctly in your databases, and be mindful of their potential risks. With these tips, you’ll be well-equipped to handle UUIDs effectively in your projects!


Feel free to comment below if you have any questions or additional tips about UUIDs! Happy coding!

以上是了解 UUID:初級開發人員後端工程師指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn