如何在Python中使用UUID生成随机ID
UUID代表“通用唯一标识符”,它是一个Python库,可帮助生成128位ID的随机对象。由于它根据时间,计算机硬件(MAC等)生成ID,因此它提供了唯一性。在本文中,我们将了解如何使用Python UUID模块生成通用唯一标识符。
详细了解UUID
UUID是128位长的数字或ID,用于唯一地标识敏感信息或不敏感信息,例如文件,用户,资源或计算机系统中的信息。
- UUID可以确保标识符在所有空间和时间上的唯一性。当我们谈论空间和时间时,这意味着UUID是根据标准生成的。同样,标识符不重复已经创建的标识符或将被创建以标识其他标识符的标识符。
- 因此,在需要唯一值的地方,UUID是有益的。
Python中的UUID模块根据RFC 4122实现。RFC 4122是互联网协会的标准和版权(C)。 RFC 4122规范包含所有详细信息和算法,以生成所有版本的唯一标识符。 RFC 4122文档定义了三种创建UUID的算法。
因此,使用Python UUID模块,您可以生成版本1、3、4和5 UUID。使用uuid模块生成的UUID是不可变的。
Python UUID模块提供以下版本的UUID。
- UUID1使用主机MAC地址,序列号和当前时间生成UUID。 uuid1版本使用IEEE 802 MAC地址。
- UUID3和UUID5使用加密货币哈希和应用程序提供的文本字符串来生成UUID。 UUID 3使用MD5哈希,而UUID 5使用SHA-1哈希。
- UUID4使用伪随机数生成器生成UUID。更安全。
uuid1()的表示形式
- bytes:以16个字节的字符串形式返回id。
- int:以128位整数的形式返回id。
- hex:将随机ID返回为32个字符的十六进制字符串。
uuid1()的组件
- version:是UUID的版本号。
- 变体:这是确定UUID内部布局的变体。
uuid1()的字段
- time_low:ID的前32位。
- time_mid:ID的后16位。
- time_hi_version:ID的后16位。
- clock_seq_hi_variant:ID的下8位。
- clock_seq_low:ID的下8位。
- 节点:ID的最后48位
- 时间:ID的时间分量字段。
- clock_seq:14位序列号。
让我们提取并打印uuid.uuid1()的上述信息。
import uuid UUID = uuid.uuid1() print("UUID is ", UUID) print("UUID Type is ", type(UUID)) print('UUID.bytes :', UUID.bytes) print('UUID.bytes_le :', UUID.bytes_le) print('UUID.hex :', UUID.hex) print('UUID.int :', UUID.int) print('UUID.urn :', UUID.urn) print('UUID.variant :', UUID.variant) print('UUID.version :', UUID.version) print('UUID.fields :', UUID.fields) print("Prining each field seperately") print('UUID.time_low : ', UUID.time_low) print('UUID.time_mid : ', UUID.time_mid) print('UUID.time_hi_version : ', UUID.time_hi_version) print('UUID.clock_seq_hi_variant: ', UUID.clock_seq_hi_variant) print('UUID.clock_seq_low : ', UUID.clock_seq_low) print('UUID.node : ', UUID.node) print('UUID.time : ', UUID.time) print('UUID.clock_seq : ', UUID.clock_seq) print('UUID.SafeUUID : ', UUID.is_safe)
输出量
UUID is a1bd0546-9b5f-11ea-899c-d0817acce8e4 UUID Type isUUID.bytes : b'xa1xbdx05Fx9b_x11xeax89x9cxd0x81zxccxe8xe4' UUID.bytes_le : b'Fx05xbdxa1_x9bxeax11x89x9cxd0x81zxccxe8xe4' UUID.hex : a1bd05469b5f11ea899cd0817acce8e4 UUID.int : 214987158433739041298017178985725487332 UUID.urn : urn:uuid:a1bd0546-9b5f-11ea-899c-d0817acce8e4 UUID.variant : specified in RFC 4122 UUID.version : 1 UUID.fields : (2713519430, 39775, 4586, 137, 156, 229254529607908) Prining each field seperately UUID.time_low : 2713519430 UUID.time_mid : 39775 UUID.time_hi_version : 4586 UUID.clock_seq_hi_variant: 137 UUID.clock_seq_low : 156 UUID.node : 229254529607908 UUID.time : 138093573625939270 UUID.clock_seq : 2460 UUID.SafeUUID : SafeUUID.unknown
使用UUID.uuid1()生成随机ID
Python UUID模块提供uuid1()方法,该方法使用MAC地址和时间分量生成随机ID。
句法
uuid.uuid1(node=None, clock_seq=None)
参量
- 节点和Clock_seq是可选参数。
- 节点是硬件地址,是48位正整数。如果未指定节点,则使用uuid.getnode()函数获取当前主机的通用管理MAC地址。
- 如果给定clock_seq,它将用作序列号。否则,选择一个随机的14位序列号。
例
import uuid print("The random id using uuid1() is : ") print(uuid.uuid1())
输出量
The random id using uuid1() is : d8ed6420-9b50-11ea-9dad-d0817acce8e4
您可以看到我们已经生成了随机ID。现在,我们可以在应用程序中的任何位置使用此id或在加密货币中使用该ID,以进一步加强加密货币。
使用节点和时钟序列为主机生成唯一的ID
我们可以应用节点和时钟序列来显式运行。
import uuid print("Use of node and clock sequence") clock_seq = 1111 node = 0xcff7894d4a0 print(uuid.uuid1(node, clock_seq))
输出量
Use of node and clock sequence 9569ef86-9b58-11ea-8457-0cff7894d4a0
uuid.getnode()方法用于获取网络接口的MAC地址。如果一台计算机具有多个被普遍管理的网络,则将返回MAC地址,而不是通过本地管理的MAC地址返回。
如果getnode()函数无法获取MAC地址,则所管理的MAC地址保证为全局唯一。它会按照RFC 4122中的建议返回带有多播位的随机48位数字。
uuid1()的缺点
uuid1()方法的主要缺点是这种方式包括使用计算机的MAC地址,因此即使提供了唯一性,也可能会损害隐私。因此,uuid1()方法在对数据敏感的应用程序中没有用。
使用UUID.uuid4()生成随机ID
Python uuid.uuid4()函数返回随机数。而且不影响隐私。
import uuid print("The random id using uuid4() is : ") print(uuid.uuid4())
输出量
The random id using uuid4() is : 2f98f4b1-81ff-4876-b0f5-a48979b04219
从输出中,UUID建立在五个组件上,每个组件都有固定的长度。连字符将各个部分分开。 UUID的格式为“ 8-4-4-4-12”。然后,第一个分量具有8位,第二个分量具有4位,第三个分量具有4位,第四个分量具有4位,第五个分量具有12位。
UUID字符串表示形式的正式定义如下。
UUID = time_low“-”“ time_mid”-“ time_high_and_version”“ clock_seq_and_reserved_And_clock_seq_low“-”节点。
uuid4()创建随机UUID。发生冲突的机会很小。当需要在单独的计算机上创建UUID或需要生成安全的UUID时,请使用UUID4()。
使用uuid3()生成随机ID
uuid.uuid3(namespace,name)函数根据名称空间标识符(它是UUID)和字符串的MD5哈希值生成UUID。
UUID模块定义了以下与uuid3()或uuid5()一起使用的名称空间标识符。
- UUID.NAMESPACE_DNS:它表示标准域名。例如,google.com。
- UUID.NAMESPACE_URL承载一份完整的UUID.NAMESPACE_URL。
- UUID.NAMESPACE_OID定义此名称空间后,名称字符串是ISO OID。
- UUID.NAMESPACE_X500定义此命名空间后,名称字符串是DER或文本输出格式的X.500 DN。
让我们使用uuid3()生成随机ID。
import uuid hosts = ['google.com', 'facebook.com', 'amazon.com'] for host in hosts: print('Generate uuid3') print(uuid.uuid3(uuid.NAMESPACE_DNS, host))
输出量
Generate uuid3 9a74c83e-2c09-3513-a74b-91d679be82b8 Generate uuid3 1e93767f-9f44-31f4-aa41-08c8da88a58c Generate uuid3 c9485c47-6e77-30b4-88da-bbac9aa4ebf2
使用相同名称空间和相同名称在不同时间生成的UUID相等。从同一名称空间中的两个不同名称生成的唯一ID是不同的。在两个不同的命名空间中,由相同名称生成的UUID是不同的。
使用uuid5()生成随机ID
我们可以从上面的函数中应用相同的公式,但是不同的是,这一次我们使用了uuid5()函数。
import uuid hosts = ['google.com', 'facebook.com', 'amazon.com'] for host in hosts: print('Generate uuid5') print(uuid.uuid5(uuid.NAMESPACE_DNS, host))
输出量
Generate uuid5 64ee70a4-8cc1-5d25-abf2-dea6c79a09c8 Generate uuid5 03d4c789-f11c-533a-a48c-31ba2319170b Generate uuid5 a7846505-8bcc-57b5-a555-e1f871002f46
何时以及为何使用UUID
目前最常用的应用程序之一是密码学和网络安全。如果您要去银行,那么当您存钱时,将创建交易,然后生成交易ID。现在,我们可以使用此处创建交易ID。我们可以使用UUID创建交易ID。因此,在财务应用程序中,这可能会有所帮助。
UUID还有助于生成唯一的会话ID,以帮助状态管理。如果您正在使用Laravel或其他PHP框架,那么您已经看到我们正在使用自动增量技术创建用户ID。其中,每次创建用户时,我们都将其ID加1。在这种情况下,我们可以轻松猜出用户ID。
使用UUID时,很难猜出ID,因为UUID并非以任何串行格式创建的,因此很难猜测它的序列或顺序。因此,它对Web开发也有帮助。 UUID具有显着的优势,因为UUID是环境独立的。即,在使用任何应用程序的任何计算机上生成的UUID都是唯一的。
结论
首先,在本教程中,我们了解了uuid模块是什么以及它的功能可以帮助我们为不同的场景创建随机ID。然后,我们了解了为什么以及何时可以在实际项目中使用uuid。
最后,在Python示例中使用UUID生成随机ID结束了。