」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 了解 UUID:初級開發人員後端工程師指南

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

發佈於2024-11-08
瀏覽:847

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. 未使用正确的 UUID 版本:UUID 有多个版本(例如,uuid1()、uuid3()、uuid4()、uuid5()),每个版本都适合特定用途案例。 uuid4() 基于随机数,最常用于在 Web 应用程序中生成唯一 ID。请注意您正在使用哪个版本以及它是否适合您的需求。

  3. 忽略碰撞可能性:虽然 UUID 被设计为唯一的,但发生碰撞的可能性非常小。对于大多数应用程序来说,风险可以忽略不计,但如果您要生成数十亿个 UUID 或在高度敏感的环境中运行,则应该实施冲突检测。

使用 UUID 的最佳实践

  1. 使用 UUID 进行外部引用:在 URL 或 API 中公开 ID 时,优先使用 UUID 而不是顺序 ID。这增强了安全性并使用户更难预测资源 ID。

  2. 以本机格式存储 UUID:使用数据库的本机 UUID 类型来存储 UUID,而不是字符串。这可以减少存储空间并提高查询性能。

  3. 选择正确的 UUID 版本:在大多数情况下,uuid4()(基于随机的 UUID)是在 Web 应用程序中生成唯一标识符的最佳选择。但是,如果您需要确定性生成的 UUID,您可以考虑 uuid3() 或 uuid5() (基于命名空间的 UUID)。

  4. 验证 UUID:从用户输入接受 UUID 时,请始终验证它们以确保它们在处理前格式正确。在Python中,您可以使用UUID对象来检查字符串的有效性。

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

结论

UUID 是用于在分布式系统中生成唯一标识符并确保 Web 应用程序安全性的强大工具。它们可以帮助您避免数据库迁移期间的数据冲突、可预测的 ID 攻击和 ID 冲突等问题。通过了解并遵循 UUID 的最佳实践,您可以构建更强大、可扩展且安全的后端系统。

请记住使用适当的 UUID 版本,将它们正确存储在数据库中,并注意它们的潜在风险。有了这些技巧,您将能够在项目中有效地处理 UUID!


如果您对 UUID 有任何疑问或其他提示,请随时在下面发表评论!快乐编码!

版本聲明 本文轉載於:https://dev.to/usooldatascience/understanding-uuids-a-backend-engineers-guide-for-junior-developers-5075?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 為什麼 Debian 和 Ubuntu Docker 容器之間的標準輸出緩衝不同?
    為什麼 Debian 和 Ubuntu Docker 容器之間的標準輸出緩衝不同?
    Docker 容器中的標準輸出緩衝:Debian 與Ubuntu 的案例在Docker 容器中執行程式碼時,標準輸出緩衝可能會發生在某些情況下,但在其他情況下則不然。在使用 io.MultiWriter 將 stdout 定向到控制台和日誌檔案的情況下會出現此問題。 根本原因:平台差異根本原因造成此...
    程式設計 發佈於2024-11-08
  • 什麼是本地主機?本地主機作為開發人員的用途
    什麼是本地主機?本地主機作為開發人員的用途
    您有沒有想過當開發人員在將網站上線之前測試網站時會發生什麼?或者網路管理員如何檢查他們的系統是否正常運作?答案在於一個強大但經常被誤解的概念,稱為 localhost。讓我們深入了解 localhost 是什麼、為何它很重要以及它如何變得非常有用。 什麼是本地主機? 用最簡單的術語...
    程式設計 發佈於2024-11-08
  • 語意HTML
    語意HTML
    語意 HTML 是 HTML 的一部分,可協助您以維護和 SEO 友善的方式組織您的網站。 SEO 代表:搜尋引擎優化。 當您在建立網站時遵循 HTML 語意時,網站往往會更容易被搜尋引擎排名更高,當然也能讓螢幕閱讀器更輕鬆地瀏覽您的網站。 以下是一些語意 HTML 標籤: 1- 「標題」標籤...
    程式設計 發佈於2024-11-08
  • 如何在單一 FastAPI 端點中處理表單和 JSON 資料?
    如何在單一 FastAPI 端點中處理表單和 JSON 資料?
    如何建立可以接受表單或 JSON 正文的 FastAPI 端點? 在 FastAPI 中,您可以建立可以接受表單或 JSON 正文的端點使用不同的方法。以下是幾個選項:選項1:使用依賴函數此選項涉及建立一個依賴函數,該函數檢查Content-Type 請求標頭的值並使用Starlette 的方法解析...
    程式設計 發佈於2024-11-08
  • 如何在 Golang 中合併多個映射,同時避免重複值?
    如何在 Golang 中合併多個映射,同時避免重複值?
    在Golang 中合併映射問題:合併多個映射,保留與跨映射中的相同鍵關聯的值。 初始方法:提供的程式碼嘗試透過迭代每個映射來合併映射,根據匹配鍵將值新增至結果映射。但是,此方法不處理結果映射中的重複值。 簡單合併:可以透過將值附加到切片來實現修改後的合併函數來處理重複項與結果映射中的鍵關聯。 fu...
    程式設計 發佈於2024-11-08
  • 將 ZingGrid 連接到 Supabase:在幾分鐘內新增後端
    將 ZingGrid 連接到 Supabase:在幾分鐘內新增後端
    從我在 Zing 部落格上的文章中交叉發布。 Supabase 是一個開源 Firebase 替代品。他們提供多種服務,但出於本文的目的,我們將深入探討它如何充當網格的簡單後端。 初始設定 在開始設定網格之前,我們需要在 Supabase 方面執行幾個步驟。 1...
    程式設計 發佈於2024-11-08
  • 如何在水平行中建立重疊的 Flex 項目?
    如何在水平行中建立重疊的 Flex 項目?
    創建重疊的 Flex 項目創建可能超出可用寬度的水平行 Flex 項目時,通常需要讓它們重疊。預設情況下,Flexbox 會縮小項目以適合容器。 Flexbox 方法要實現重疊,我們可以使用以下方法: overflow: visible;}.card { width: 10em; min-width...
    程式設計 發佈於2024-11-08
  • 適合初學者的 Vue.js VueJs 部分錶單和事件監聽器
    適合初學者的 Vue.js VueJs 部分錶單和事件監聽器
    為什麼要使用 Vue.js 作為表單? Vue.js 在建立表單方面的優勢: 簡單的資料綁定:Vue.js 使用 v-model 在表單輸入和元件資料之間綁定數據,使同步變得容易。 反應性:模型資料的任何變更都會自動更新視圖,確保使用者始終看到最新的數據,而無需編...
    程式設計 發佈於2024-11-08
  • Context API 與 Redux
    Context API 與 Redux
    在 React 生態系統中,Context API 和 Redux 都是流行的狀態管理工具,但它們有不同的用途並具有不同的優勢。 React 內建的 Context API 提供了一種在元件樹中共用狀態的方法,而無需在每個層級手動傳遞 props。它對於更簡單的應用程式或主題管理或用戶身份驗證等特定...
    程式設計 發佈於2024-11-08
  • 我們如何使用臨時容器建立範圍管道?
    我們如何使用臨時容器建立範圍管道?
    使用臨時容器實現範圍管道要建立處理臨時容器內的值的範圍管道,必須合併views::cache1運算子。此運算符會快取轉換的結果,確保其可用於後續操作。 考慮以下場景,其中第三方函數 f 接受類型 T 的參數並傳回 T 的向量。將f 套用於無限範圍src 的所有元素並將結果展平為單一範圍的範圍管道,我...
    程式設計 發佈於2024-11-08
  • 如何使用 Python 檢索 Github 儲存庫數據
    如何使用 Python 檢索 Github 儲存庫數據
    您的組織是否擁有太多github 儲存庫,並且您需要一種簡單的方法來總結和記錄每個儲存庫的內容以用於報告、儀表板或審計目的?下面是一個使用 Github API 完成該操作的快速腳本。 功能: get_repo_info(所有者,回購): 取得 GitHub 儲存庫擁有者的使用者名...
    程式設計 發佈於2024-11-08
  • 使用 useState 的狀態更新方法
    使用 useState 的狀態更新方法
    React 是用於開發動態和互動式使用者介面的最受歡迎的 JavaScript 程式庫之一。在開發應用程式時,狀態管理對於效能和使用者體驗至關重要。在這種情況下,useState 掛鉤是管理元件狀態的最常見方法之一。在本文中,我們將深入研究 useState. 的狀態更新方法 狀態更...
    程式設計 發佈於2024-11-08
  • 考慮到 libcurl 的可用性,何時適合在 PHP 中啟用「allow_url_fopen」?
    考慮到 libcurl 的可用性,何時適合在 PHP 中啟用「allow_url_fopen」?
    在 PHP 中允許「allow_url_fopen」:平衡行為開發人員經常要求在 PHP 中啟動「allow_url_fopen」。在本文中,我們將檢查目前的行業規格並評估允許此功能是否仍然謹慎,特別是在 libcurl 可用的情況下。 當前行業規範對於大多數 Web 應用程序,啟用“allow_u...
    程式設計 發佈於2024-11-08
  • 何時在 jQuery.parseJSON 中使用單引號和雙引號?
    何時在 jQuery.parseJSON 中使用單引號和雙引號?
    jQuery.parseJSON 中的單引號與雙引號使用jQuery 的parseJSON 方法時,使用者可能會遇到行為差異,具體取決於是單引號還是雙引號雙引號用於將JSON 字串括起來。在本文中,我們將探討這些差異。 雙引號:標準方法根據 JSON 標準,雙引號被認為是括起的首選方法JSON 字串...
    程式設計 發佈於2024-11-08
  • 如何處理多處理 Python 應用程式中的日誌記錄?
    如何處理多處理 Python 應用程式中的日誌記錄?
    Python 中的多處理日誌記錄使用Python 的多處理模組時,重要的是要考慮日誌記錄實踐,以避免因多個進程寫入而導致錯誤同時處理相同的檔案句柄。預設情況下,mp.get_logger() 提供的多處理感知記錄器可確保 sys.stderr 中正確的鎖定機制。 但是,不支援多處理感知的模組可能需要...
    程式設計 發佈於2024-11-08

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3