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

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

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

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]刪除
最新教學 更多>
  • 如何高效地在一個事務中插入數據到多個MySQL表?
    如何高效地在一個事務中插入數據到多個MySQL表?
    mySQL插入到多個表中,該數據可能會產生意外的結果。雖然似乎有多個查詢可以解決問題,但將從用戶表的自動信息ID與配置文件表的手動用戶ID相關聯提出了挑戰。 使用Transactions和last_insert_id() 插入用戶(用戶名,密碼)值('test','tes...
    程式設計 發佈於2025-07-14
  • 在細胞編輯後,如何維護自定義的JTable細胞渲染?
    在細胞編輯後,如何維護自定義的JTable細胞渲染?
    在JTable中維護jtable單元格渲染後,在JTable中,在JTable中實現自定義單元格渲染和編輯功能可以增強用戶體驗。但是,至關重要的是要確保即使在編輯操作後也保留所需的格式。 在設置用於格式化“價格”列的“價格”列,用戶遇到的數字格式丟失的“價格”列的“價格”之後,問題在設置自定義單元...
    程式設計 發佈於2025-07-14
  • eval()vs. ast.literal_eval():對於用戶輸入,哪個Python函數更安全?
    eval()vs. ast.literal_eval():對於用戶輸入,哪個Python函數更安全?
    稱量()和ast.literal_eval()中的Python Security 在使用用戶輸入時,必須優先確保安全性。強大的python功能eval()通常是作為潛在解決方案而出現的,但擔心其潛在風險。本文深入研究了eval()和ast.literal_eval()之間的差異,突出顯示其安全性含義...
    程式設計 發佈於2025-07-14
  • 大批
    大批
    [2 數組是對象,因此它們在JS中也具有方法。 切片(開始):在新數組中提取部分數組,而無需突變原始數組。 令ARR = ['a','b','c','d','e']; // USECASE:提取直到索引作...
    程式設計 發佈於2025-07-14
  • 如何實時捕獲和流媒體以進行聊天機器人命令執行?
    如何實時捕獲和流媒體以進行聊天機器人命令執行?
    在開發能夠執行命令的chatbots的領域中,實時從命令執行實時捕獲Stdout,一個常見的需求是能夠檢索和顯示標準輸出(stdout)在cath cath cant cant cant cant cant cant cant cant interfaces in Chate cant inter...
    程式設計 發佈於2025-07-14
  • 為什麼我會收到MySQL錯誤#1089:錯誤的前綴密鑰?
    為什麼我會收到MySQL錯誤#1089:錯誤的前綴密鑰?
    mySQL錯誤#1089:錯誤的前綴鍵錯誤descript [#1089-不正確的前綴鍵在嘗試在表中創建一個prefix鍵時會出現。前綴鍵旨在索引字符串列的特定前綴長度長度,可以更快地搜索這些前綴。 了解prefix keys `這將在整個Movie_ID列上創建標準主鍵。主密鑰對於唯一識...
    程式設計 發佈於2025-07-14
  • PHP陣列鍵值異常:了解07和08的好奇情況
    PHP陣列鍵值異常:了解07和08的好奇情況
    PHP數組鍵值問題,使用07&08 在給定數月的數組中,鍵值07和08呈現令人困惑的行為時,就會出現一個不尋常的問題。運行print_r($月)返回意外結果:鍵“ 07”丟失,而鍵“ 08”分配給了9月的值。 此問題源於PHP對領先零的解釋。當一個數字帶有0(例如07或08)的前綴時,PHP將...
    程式設計 發佈於2025-07-14
  • 在Pandas中如何將年份和季度列合併為一個週期列?
    在Pandas中如何將年份和季度列合併為一個週期列?
    pandas data frame thing commans date lay neal and pree pree'和pree pree pree”,季度 2000 q2 這個目標是通過組合“年度”和“季度”列來創建一個新列,以獲取以下結果: [python中的concate...
    程式設計 發佈於2025-07-14
  • 如何正確使用與PDO參數的查詢一樣?
    如何正確使用與PDO參數的查詢一樣?
    在pdo 中使用類似QUERIES在PDO中的Queries時,您可能會遇到類似疑問中描述的問題:此查詢也可能不會返回結果,即使$ var1和$ var2包含有效的搜索詞。錯誤在於不正確包含%符號。 通過將變量包含在$ params數組中的%符號中,您確保將%字符正確替換到查詢中。沒有此修改,PD...
    程式設計 發佈於2025-07-14
  • 為什麼我的CSS背景圖像出現?
    為什麼我的CSS背景圖像出現?
    故障排除:CSS背景圖像未出現 ,您的背景圖像儘管遵循教程說明,但您的背景圖像仍未加載。圖像和样式表位於相同的目錄中,但背景仍然是空白的白色帆布。 而不是不棄用的,您已經使用了CSS樣式: bockent {背景:封閉圖像文件名:背景圖:url(nickcage.jpg); 如果您的html,cs...
    程式設計 發佈於2025-07-14
  • 我可以將加密從McRypt遷移到OpenSSL,並使用OpenSSL遷移MCRYPT加密數據?
    我可以將加密從McRypt遷移到OpenSSL,並使用OpenSSL遷移MCRYPT加密數據?
    將我的加密庫從mcrypt升級到openssl 問題:是否可以將我的加密庫從McRypt升級到OpenSSL?如果是這樣,如何? 答案:是的,可以將您的Encryption庫從McRypt升級到OpenSSL。 可以使用openssl。 附加說明: [openssl_decrypt()函數要求...
    程式設計 發佈於2025-07-14
  • 如何克服PHP的功能重新定義限制?
    如何克服PHP的功能重新定義限制?
    克服PHP的函數重新定義限制在PHP中,多次定義一個相同名稱的函數是一個no-no。嘗試這樣做,如提供的代碼段所示,將導致可怕的“不能重新列出”錯誤。 但是,PHP工具腰帶中有一個隱藏的寶石:runkit擴展。它使您能夠靈活地重新定義函數。 runkit_function_renction_...
    程式設計 發佈於2025-07-14
  • \“(1)vs.(;;):編譯器優化是否消除了性能差異?\”
    \“(1)vs.(;;):編譯器優化是否消除了性能差異?\”
    答案: 在大多數現代編譯器中,while(1)和(1)和(;;)之間沒有性能差異。編譯器: perl: 1 輸入 - > 2 2 NextState(Main 2 -E:1)V-> 3 9 Leaveloop VK/2-> A 3 toterloop(next-> 8 last-> 9 ...
    程式設計 發佈於2025-07-14
  • 為什麼使用Firefox後退按鈕時JavaScript執行停止?
    為什麼使用Firefox後退按鈕時JavaScript執行停止?
    導航歷史記錄問題:JavaScript使用Firefox Back Back 此行為是由瀏覽器緩存JavaScript資源引起的。要解決此問題並確保在後續頁面訪問中執行腳本,Firefox用戶應設置一個空功能。 警報'); }; alert('inline Alert')...
    程式設計 發佈於2025-07-14
  • Java是否允許多種返回類型:仔細研究通用方法?
    Java是否允許多種返回類型:仔細研究通用方法?
    在Java中的多個返回類型:一種誤解類型:在Java編程中揭示,在Java編程中,Peculiar方法簽名可能會出現,可能會出現,使開發人員陷入困境,使開發人員陷入困境。 getResult(string s); ,其中foo是自定義類。該方法聲明似乎擁有兩種返回類型:列表和E。但這確實是如此嗎...
    程式設計 發佈於2025-07-14

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

Copyright© 2022 湘ICP备2022001581号-3