第十二章:互联网-uuid:全局唯一标识符-UUID 1: IEEE 802 MAC地址

12.8 uuid:全局唯一标识符

uuid模块实现了RFC 4122中描述的全局唯一标识符(Universally Unique Identifier):这个RFC定义了一个系统,可以为资源创建唯一的标识符,这里采用一种不需要集中注册机的方式。UUID值为128位。正如参考指南所述,“UUID可以保证跨空间和时间的唯一性”。对于文档、主机、应用客户以及其他需要唯一值的情况,UUID可以用来生成标识符。这个RFC特别强调创建一个统一资源名(Uniform Resource Name)命名空间,并且涵盖了3个主要算法。
使用IEEE 802 MAC 地址作为唯一性来源
使用伪随机数
使用公开的串并结合密码散列
在上述所有情况下,种子值都要与系统时钟结合,如果向后设置时钟,则要用一个时钟序列值维护唯一性。

12.8.1 UUID 1: IEEE 802 MAC地址
UUID 1值使用主机的MAC地址计算。uuid模块使用getnode()来获取当前系统的MAC值。

import uuid

print(hex(uuid.getnode()))

如果一个系统有多个网卡,那么响应地便会有多个MAC地址,并且可能返回其中任意一个值。
运行结果:
在这里插入图片描述
要为一个主机(由其MAC地址标识)生成一个UUID,需要使用uuid1()函数。节点标识符参数是可选的;如果没有设置这个域,那么便会使用getnode()返回的值。

import uuid

u = uuid.uuid1()

print(u)
print(type(u))
print('byetes   :',repr(u.bytes))
print('hex      :',u.hex)
print('int      :',u.int)
print('urn      :',u.urn)
print('variant  :',u.variant)
print('version  :',u.version)
print('fields   :',u.fields)
print('  time_low            : ',u.time_low)
print('  time_mid            : ',u.time_mid)
print('  time_hi_version     : ',u.time_hi_version)
print('  clock_seq_hi_variant: ',u.clock_seq_hi_variant)
print('  clock_seq_low       : ',u.clock_seq_low)
print('  node                : ',u.node)
print('  time                : ',u.time)
print('  clock_seq           : ',u.clock_seq)

对于返回的UUID对象,可以通过只读的实例属性访问它的各个部分。有些属性是UUID值的不同表示,如hex,int和urn。
运行结果:
在这里插入图片描述
由于有时间分量(time),所以每次调用uuid1()都会返回一个新值。

import uuid

for i in range(3):
    print(uuid.uuid1())

在这个输出中,只有时间分量(串的开始部分)有变化。
运行结果:
在这里插入图片描述
由于每个计算机有不同的MAC地址,所以在不同系统上运行这个示例程序会生成完全不同的值。下一个例子传递不同节点ID来模拟在不同主机上运行。

import uuid

for node in [0x1ec200d9e0,0x1e5274040e]:
    print(uuid.uuid1(node),hex(node))

除了返回不同的时间值,UUID末尾的节点标识符也有变化。
运行结果:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值