详解Python标准库UUID

本文中,介绍一个常用的python标准库,用于生成唯一标识,一个非常常见的一种方法,没啥特别的,就是给大家扫个盲,希望能够帮助到大家!

UUID是什么

beddf634de3449ece67e9293a00f2bf6.gif

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有什么用

2640961fd5a9359696ea0d2829c75715.gif

很多应用场景需要一个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模块中最常用的几个函数总结如下:

uuid.uuid1()

uuid.uuid1([node[, clock_seq]]) -- 基于时间戳

由 MAC 地址(主机物理地址)、当前时间戳、随机数生成。可以保证全球范围内的唯一性, 但 MAC 的使用同时带来安全性问题,局域网中可以使用 IP 来代替MAC。

该函数有两个参数, 如果 node 参数未指定, 系统将会自动调用 getnode() 函数来获取主机的硬件地址. 如果 clock_seq 参数未指定系统会使用一个随机产生的14位序列号来代替.

注意:uuid1() 返回的不是普通的字符串,而是一个 uuid 对象,其内含有丰富的成员函数和变量。

uuid.uuid2()

uuid.uuid2() -- 基于分布式计算环境DCE(Python中没有这个函数)

算法与uuid1相同,不同的是把时间戳的前 4 位置换为 POSIX 的 UID。实际中很少用到该方法。

uuid.uuid3()

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

通过计算名字和命名空间的MD5散列值得到,保证了同一命名空间中不同名字的唯一性, 和不同命名空间的唯一性,但同一命名空间的同一名字生成相同的uuid。

uuid.uuid4()

uuid.uuid4() -- 基于随机数

由伪随机数得到,有一定的重复概率,该概率可以计算出来。

uuid.uuid5()

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

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

上述几个函数的使用方法:

# 记得关注和星标 @公众号:数据STUDIO 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
原文链接:https://www.cnblogs.com/hellojesson/p/6410445.html
编辑:@公众号:关于数据分析与可视化

ddcad429790028793dc929bfc942c300.gif

NO.1

往期推荐

Historical articles

【数据分析与娱乐八卦】从Python可视化图表中探究王心凌出圈的流量密码

【原创佳作】介绍Pandas实战中一些高端玩法

分享一个2022年火遍全网的Python框架

Docker 常用命令大全

分享、收藏、点赞、在看安排一下?

70f93ea367bb72687ade7ff978b63b6f.gif

9824a8e9a967ae13800018e312e3fe44.gif

d1133aab03ec4fa66f5b4d001cf9f9f7.gif

1569d0a58a413ebd4640cf77a01f55b5.gif

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值