一、UUID簡介
UUID,全稱通用唯一標識符,是一個128位長的數字,用於在計算機系統中的標識符上保證唯一性。
在Python 3中,使用uuid模塊就能夠輕鬆生成UUID。
import uuid
print(uuid.uuid1()) # 基於時間戳生成
print(uuid.uuid3(uuid.NAMESPACE_DNS, 'python.org')) # 基於命名空間和字元串生成
print(uuid.uuid4()) # 隨機生成
print(uuid.uuid5(uuid.NAMESPACE_DNS, 'python.org')) # 基於命名空間和字元串生成
uuid1()函數使用的是計算機本地的時間戳和MAC地址來生成UUID,保證同一個計算機上的UUID唯一,但是在不同計算機上生成的UUID可能會有重複。
uuid3()和uuid5()函數,則是基於命名空間和字元串來計算出UUID,保證同一個命名空間內的UUID是唯一的,但是不同命名空間之間的UUID可能會存在重複。
而uuid4()函數則是隨機生成UUID,保證UUID的全球唯一性。
二、uuid1()和uuid4()函數詳解
隨機性與可預測性成為了UUID最為關注的問題,也是使用UUID的最初動因。uuid1()和uuid4()函數雖然都能夠生成隨機的UUID,但是它們生成UUID的方式又有所不同。
uuid1()函數生成UUID的過程:
1、使用計算機的當前時間和一個隨機數生成128位的序列號。
2、將設備的MAC地址插入該序列號中,通過MD5演算法生成新的序列號。
3、設置版本位(version bits)為1。
4、設置變體位(variant bits)為計算機MAC地址加密後的值,確保生成UUID的唯一性並防止衝突。
這種方法生成的UUID不僅能保證生成的UUID全球唯一,而且因為加入了MAC地址,從而也能夠保證在同一台計算機上生成的UUID是同一份。
uuid4()函數生成UUID的過程:
1、使用隨機數生成128位的序列號。
2、設置版本位(version bits)為4。
3、設置變體位(variant bits)為一個固定值,這裡就不多講了。
這種方法生成的UUID是完全隨機的,既能夠保證全球唯一,也無法預測或重現。
三、UUID和資料庫
在使用關係型資料庫的時候,會遇到一個需要全局唯一ID的場景。而UUID就是一個非常好的選擇。使用UUID作為主鍵,既能夠確保全局唯一性,也能夠在分散式系統中避免衝突。
以下是在Python中使用UUID作為主鍵的示例代碼:
import uuid
import sqlite3
conn = sqlite3.connect('example.db')
c = conn.cursor()
c.execute('''CREATE TABLE users
(id text PRIMARY KEY, name text, email text)''')
c.execute("INSERT INTO users VALUES (?, ?, ?)",
(str(uuid.uuid4()), 'Alice', 'alice@example.com'))
conn.commit()
conn.close()
在資料庫中,主鍵為UUID的表和主鍵為整數ID的表沒有區別。使用UUID能夠帶來良好的可擴展性和可移植性,如果你需要將數據遷移到其他的存儲系統,也不需要擔心ID的重複問題。
四、UUID和Web應用
在Web應用中,UUID也是一個常用的方式來唯一標識一個用戶或者一個資源。在Python中,Flask框架提供的session,就是使用UUID來識別和標識用戶的。以下是在Flask中開啟session的示例代碼:
from flask import Flask, session
import uuid
app = Flask(__name__)
app.secret_key = str(uuid.uuid4())
在這段代碼中,我們使用uuid.uuid4()生成一個隨機的密鑰,使用這個密鑰來保護session的數據。
另外,在開發RESTful API時,UUID也是一個很好的資源標識方式。以下是使用Django REST framework中使用UUID作為資源ID的示例代碼:
from rest_framework import serializers
import uuid
from .models import Book
class BookSerializer(serializers.ModelSerializer):
id = serializers.UUIDField(default=uuid.uuid4)
class Meta:
model = Book
fields = ['id', 'title', 'author', 'description']
在這裡,我們將Book的id欄位設置為UUIDField,並且將默認值設置為uuid.uuid4(),這樣就能夠自動生成UUID作為資源的唯一ID。
總結
在Python中,使用uuid模塊能夠方便地生成UUID,而且可以根據需要自行選擇生成UUID的方式。在資料庫和Web應用中,使用UUID作為唯一標識符,不僅能夠滿足全局唯一性的要求,還能夠避免ID的重複問題,具有很好的可擴展性和可移植性。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/193732.html