Python標准庫 -- UUID模塊(生成唯一標識)


看到這篇博客小伙伴,送大家個福利:

     先接着自己的思路,掌握下邊的UUID內容,回過頭來,再看下這篇python基於“雪花算法”gid生成庫。

     地址:https://www.cnblogs.com/hellojesson/p/12942757.html  

UUID是什么:

  UUID: 通用唯一標識符 ( Universally Unique Identifier ),對於所有的UUID它可以保證在空間和時間上的唯一性,也稱為GUID,全稱為:

  • UUID —— Universally Unique IDentifier  Python中稱為 UUID
  • GUID —— Globally Unique IDentifier     C#中稱為 GUID

它是通過MAC地址、 時間戳、 命名空間、 隨機數、 偽隨機數來保證生成ID的唯一性,,有着固定的大小( 128 bit位 ),通常由 32 字節的字符串(十六進制)表示。

        它的唯一性和一致性特點,使得可以無需注冊過程就能夠產生一個新的UUID;UUID可以被用作多種用途, 既可以用來短時間內標記一個對象,也可以可靠的辨別網絡中的持久性對象。

UUID有什么用?

  很多應用場景需要一個id,但是又不要求這個id 有具體的意義,僅僅用來標識一個對象。常見的用處有數據庫表的id字段;另一個例子是前端的各種UI庫,因為它們通常需要動態創建各種UI元素,這些元素需要唯一的id, 這時候就需要使用UUID了。例如:一個網站在存儲視頻、圖片等格式的文件時,這些文件的命名方式就可以采用 UUID生成的隨機標識符,避免重名的出現。

UUID模塊提供的UUID類和函數

        python的uuid模塊提供的UUID類和函數uuid1(),uuid3(),uuid4(),uuid5() 來生成1, 3, 4, 5各個版本的UUID ( 需要注意的是:python中沒有uuid2()這個函數)。

對uuid模塊中最常用的幾個函數總結如下:

1.  uuid.uuid1([node[, clock_seq]]) -- 基於時間戳

由 MAC 地址(主機物理地址)、當前時間戳、隨機數生成。可以保證全球范圍內的唯一性,
但 MAC 的使用同時帶來安全性問題,局域網中可以使用 IP 來代替MAC。

該函數有兩個參數, 如果 node 參數未指定, 系統將會自動調用 getnode() 函數來獲取主機的硬件地址. 如果 clock_seq  參數未指定系統會使用一個隨機產生的14位序列號來代替.

注意: uuid1() 返回的不是普通的字符串,而是一個 uuid 對象,其內含有豐富的成員函數和變量。

2.  uuid.uuid2() -- 基於分布式計算環境DCE(Python中沒有這個函數)

算法與uuid1相同,不同的是把時間戳的前 4 位置換為 POSIX 的 UID。
實際中很少用到該方法。

3.  uuid.uuid3(namespace, name) -- 基於名字的MD5散列值

通過計算名字和命名空間的MD5散列值得到,保證了同一命名空間中不同名字的唯一性,
和不同命名空間的唯一性,但同一命名空間的同一名字生成相同的uuid。

4.  uuid.uuid4() -- 基於隨機數

由偽隨機數得到,有一定的重復概率,該概率可以計算出來。

5.  uuid.uuid5() -- 基於名字的SHA-1散列值

算法與uuid3相同,不同的是使用 Secure Hash Algorithm 1 算法

上述幾個函數的使用方法:

>>> import uuid # 導入UUID模塊

>>> # make a UUID based on the host ID and current time
>>> uuid.uuid1()
UUID('a8098c1a-f86e-11da-bd1a-00112444be1e')

>>> # make a UUID using an MD5 hash of a namespace UUID and a name
>>> uuid.uuid3(uuid.NAMESPACE_DNS, 'python.org')
UUID('6fa459ea-ee8a-3ca4-894e-db77e160355e')

>>> # make a random UUID
>>> uuid.uuid4()
UUID('16fd2706-8baf-433b-82eb-8c7fada847da')

>>> # make a UUID using a SHA-1 hash of a namespace UUID and a name
>>> uuid.uuid5(uuid.NAMESPACE_DNS, 'python.org')
UUID('886313e1-3b8a-5372-9b90-0c9aee199e5d')

>>> # make a UUID from a string of hex digits (braces and hyphens ignored)
>>> x = uuid.UUID('{00010203-0405-0607-0809-0a0b0c0d0e0f}')

>>> # convert a UUID to a string of hex digits in standard form
>>> str(x)
'00010203-0405-0607-0809-0a0b0c0d0e0f'

>>> # get the raw 16 bytes of the UUID
>>> x.bytes
'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f'

>>> # make a UUID from a 16-byte string
>>> uuid.UUID(bytes=x.bytes)
UUID('00010203-0405-0607-0809-0a0b0c0d0e0f')

實例:

首先,Python中沒有基於 DCE 的,所以uuid2可以忽略;
其次,uuid4存在概率性重復,由無映射性,最好不用;
再次,若在Global的分布式計算環境下,最好用uuid1;
最后,若有名字的唯一性要求,最好用uuid3或uuid5。

import uuid
name = "test_name"
namespace = "test_namespace"

print uuid.uuid1()  # 帶參的方法參見Python Doc
print uuid.uuid3(namespace, name)
print uuid.uuid4()
print uuid.uuid5(namespace, name)

uuid模塊文檔:https://docs.python.org/2/library/uuid.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM