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

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

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

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]刪除
最新教學 更多>
  • 如何使用Java.net.urlConnection和Multipart/form-data編碼使用其他參數上傳文件?
    如何使用Java.net.urlConnection和Multipart/form-data編碼使用其他參數上傳文件?
    使用http request 上傳文件上傳到http server,同時也提交其他參數,java.net.net.urlconnection and Multipart/form-data Encoding是普遍的。 Here's a breakdown of the process:Mu...
    程式設計 發佈於2025-04-16
  • Python高效去除文本中HTML標籤方法
    Python高效去除文本中HTML標籤方法
    在Python中剝離HTML標籤,以獲取原始的文本表示 僅通過Python的MlStripper 來簡化剝離過程,Python Standard庫提供了一個專門的功能,MLSTREPERE,MLSTREPERIPLE,MLSTREPERE,MLSTREPERIPE,MLSTREPERCE,MLST...
    程式設計 發佈於2025-04-16
  • 如何在php中使用捲髮發送原始帖子請求?
    如何在php中使用捲髮發送原始帖子請求?
    如何使用php 創建請求來發送原始帖子請求,開始使用curl_init()開始初始化curl session。然後,配置以下選項: curlopt_url:請求 [要發送的原始數據指定內容類型,為原始的帖子請求指定身體的內容類型很重要。在這種情況下,它是文本/平原。要執行此操作,請使用包含以下標頭...
    程式設計 發佈於2025-04-16
  • 如何使用FormData()處理多個文件上傳?
    如何使用FormData()處理多個文件上傳?
    )處理多個文件輸入時,通常需要處理多個文件上傳時,通常是必要的。 The fd.append("fileToUpload[]", files[x]); method can be used for this purpose, allowing you to send multi...
    程式設計 發佈於2025-04-16
  • 如何在其容器中為DIV創建平滑的左右CSS動畫?
    如何在其容器中為DIV創建平滑的左右CSS動畫?
    通用CSS動畫,用於左右運動 ,我們將探索創建一個通用的CSS動畫,以向左和右移動DIV,從而到達其容器的邊緣。該動畫可以應用於具有絕對定位的任何div,無論其未知長度如何。 問題:使用左直接導致瞬時消失 更加流暢的解決方案:混合轉換和左 [並實現平穩的,線性的運動,我們介紹了線性的轉換。...
    程式設計 發佈於2025-04-16
  • 如何檢查對像是否具有Python中的特定屬性?
    如何檢查對像是否具有Python中的特定屬性?
    方法來確定對象屬性存在尋求一種方法來驗證對像中特定屬性的存在。考慮以下示例,其中嘗試訪問不確定屬性會引起錯誤: >>> a = someClass() >>> A.property Trackback(最近的最新電話): 文件“ ”,第1行, AttributeError: SomeClass...
    程式設計 發佈於2025-04-16
  • 點擊顯示圖片的技巧及方法
    點擊顯示圖片的技巧及方法
    網絡上的大多數圖像都是多餘的。如果我可能有點混蛋,那麼其中99%的人甚至根本沒有幫助(儘管有極少數例外)。那是因為圖像通常不補充他們應該支持的文本,而是用戶,將永遠加載和炸毀像某種績效稅之類的數據上限。 值得慶幸的是,這主要是一個設計問題,因為使圖像表現效果和更易於用戶友好比以前要容易得多。我們具有...
    程式設計 發佈於2025-04-16
  • 如何修復\“常規錯誤:2006 MySQL Server在插入數據時已經消失\”?
    如何修復\“常規錯誤:2006 MySQL Server在插入數據時已經消失\”?
    How to Resolve "General error: 2006 MySQL server has gone away" While Inserting RecordsIntroduction:Inserting data into a MySQL database can...
    程式設計 發佈於2025-04-16
  • 您如何在Laravel Blade模板中定義變量?
    您如何在Laravel Blade模板中定義變量?
    在Laravel Blade模板中使用Elegance 在blade模板中如何分配變量對於存儲以後使用的數據至關重要。在使用“ {{}}”分配變量的同時,它可能並不總是最優雅的解決方案。 幸運的是,Blade通過@php Directive提供了更優雅的方法: $ old_section =...
    程式設計 發佈於2025-04-16
  • HTML格式標籤
    HTML格式標籤
    HTML 格式化元素 **HTML Formatting is a process of formatting text for better look and feel. HTML provides us ability to format text without us...
    程式設計 發佈於2025-04-16
  • 如何解決由於Android的內容安全策略而拒絕加載腳本... \”錯誤?
    如何解決由於Android的內容安全策略而拒絕加載腳本... \”錯誤?
    Unveiling the Mystery: Content Security Policy Directive ErrorsEncountering the enigmatic error "Refused to load the script..." when deployi...
    程式設計 發佈於2025-04-16
  • CSS強類型語言解析
    CSS強類型語言解析
    您可以通过其强度或弱输入的方式对编程语言进行分类的方式之一。在这里,“键入”意味着是否在编译时已知变量。一个例子是一个场景,将整数(1)添加到包含整数(“ 1”)的字符串: result = 1 "1";包含整数的字符串可能是由带有许多运动部件的复杂逻辑套件无意间生成的。它也可以是故意从单个真理...
    程式設計 發佈於2025-04-16
  • 如何使用PHP從XML文件中有效地檢索屬性值?
    如何使用PHP從XML文件中有效地檢索屬性值?
    從php PHP陷入困境。 使用simplexmlelement :: attributes()函數提供了簡單的解決方案。此函數可訪問對XML元素作為關聯數組的屬性: - > attributes()為$ attributeName => $ attributeValue){ echo...
    程式設計 發佈於2025-04-16
  • 使用Lambda表達式與PyQt槽函數為何導致意外行為?
    使用Lambda表達式與PyQt槽函數為何導致意外行為?
    使用lambda表達式連接pyqt 中的插槽,可以使用lambda表達式將信號連接到插槽。但是,在某些方案中使用lambda表達式可能會導致意外行為。 考慮以下代碼:類mainwindow(qtgui.qwidget): def __init __(自我): ... ...
    程式設計 發佈於2025-04-16
  • 包在構建時找不到原因及解決方法
    包在構建時找不到原因及解決方法
    fixing fixing“無法在go build Understanding the Package Directory StructureGo expects packages to reside in directories with the same name as their pack...
    程式設計 發佈於2025-04-16

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

Copyright© 2022 湘ICP备2022001581号-3