看到這篇博客小伙伴,送大家個福利:
先接着自己的思路,掌握下邊的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