UUID: 通用唯一標(biāo)識(shí)符 ( Universally Unique Identifier )的簡(jiǎn)寫耻涛, 對(duì)于所有的UUID它可以保證在空間和時(shí)間上的唯一性。它是通過MAC地址, 時(shí)間戳, 命名空間, 隨機(jī)數(shù), 偽隨機(jī)數(shù)來保證生成ID的唯一性, 有著固定的大小( 128 bit )瘟檩。
它的唯一性和一致性特點(diǎn)使得可以無需注冊(cè)過程就能夠產(chǎn)生一個(gè)新的UUID抹缕,它可以被用作多種用途,既可以用來短時(shí)間內(nèi)標(biāo)記一個(gè)對(duì)象, 也可以可靠的辨別網(wǎng)絡(luò)中的持久性對(duì)象墨辛。
python的uuid模塊提供UUID類和函數(shù)uuid1(), uuid3(), uuid4(), uuid5() 來生成1, 3, 4, 5各個(gè)版本的UUID ( 需要注意的是: python中沒有uuid2()這個(gè)函數(shù)). 用uuid1()或uuid4()可以獲得一個(gè)唯一的ID卓研,uuid1()包含了主機(jī)的網(wǎng)絡(luò)名稱,uuid4()不涉及網(wǎng)絡(luò)主機(jī)名睹簇,僅生成一個(gè)隨機(jī)UUID奏赘,因此從隱私保護(hù)角度uuid4()更加安全。對(duì)uuid模塊中最常用的幾個(gè)函數(shù)總結(jié)如下:
# -*- coding:utf-8 -*-
import uuid
print uuid.uuid1()
# 9fcb54d5-5cd1-11ee-9c40-e0d55e9f6355
print uuid.uuid3(uuid.NAMESPACE_DNS, 'love')
# 6deda52b-c8aa-3a78-907c-5826c79b7364
print uuid.uuid4()
# 894e75e9-d926-428c-abe0-cfd322e632fc
print uuid.uuid5(uuid.NAMESPACE_DNS, 'love')
# 1fc3f5f4-6a98-5913-82ef-406f1118aa65
下面說一下區(qū)別:
uuid1():這個(gè)是根據(jù)當(dāng)前的時(shí)間戳和MAC地址生成的太惠,最后的12個(gè)字符e0d55e9f6355對(duì)應(yīng)的就是MAC地址磨淌,因?yàn)槭荕AC地址,那么唯一性應(yīng)該不用說了凿渊。但是生成后暴露了MAC地址這就很不好了梁只。
uuid3():里面的namespace和具體的字符串都是我們指定的,然后呢···應(yīng)該是通過MD5生成的埃脏,這個(gè)我們也很少用到搪锣,莫名其妙的感覺。
uuid4():這是基于隨機(jī)數(shù)的uuid彩掐,既然是隨機(jī)就有可能真的遇到相同的构舟,但這就像中獎(jiǎng)似的,幾率超小堵幽,因?yàn)槭请S機(jī)而且使用還方便狗超,所以使用這個(gè)的還是比較多的弹澎。
uuid5():這個(gè)看起來和uuid3()貌似并沒有什么不同,寫法一樣抡谐,也是由用戶來指定namespace和字符串裁奇,不過這里用的散列并不是MD5,而是SHA1.
再來說一下簡(jiǎn)單的處理麦撵,UUID生成之后不是str類型需要轉(zhuǎn)為str:
uid = str(uuid.uuid4())
>>> str(uuid.uuid4())
'44a34eb5-aaa6-43ac-8f33-e1362e568256'
UUID中間的'-'是個(gè)比較奇怪的字符刽肠,那么應(yīng)該去掉它:hex
>>> uuid.uuid1().hex
'3b6fcaef5cd211eea2bee0d55e9f6355' //注意最后的12個(gè)字符還是 e0d55e9f6355(對(duì)應(yīng)你的Mac地址)
也可以參考官網(wǎng)介紹:https://docs.python.org/3/library/uuid.html