如何在Python中创建GUID/UUID

如何在Python中创建与平台无关的GUID/UUID?我听说有一种方法在Windows上使用ActivePython,但它是Windows,因为它使用COM。有使用普通Python的方法吗?

892986 次浏览

uuid模块提供不可变的UUID对象(UUID类)和函数#0#1#2#3,用于生成rfc4122中指定的版本1、3、4和5的UUID。

如果你想要的只是一个唯一的ID,你应该调用uuid1()uuid4()请注意,#0可能会危及隐私,因为它创建了一个包含计算机网络地址的UUID。uuid4()创建一个随机UUID。

UUID版本6和7-用于现代应用程序和数据库的新的通用唯一识别码(UUID)格式(<强>草案-可从https://pypi.org/project/uuid6/获得

文档说明

示例(对于Python 2和3):

>>> import uuid
>>> # make a random UUID>>> uuid.uuid4()UUID('bd65600d-8669-4903-8a14-af88203add38')
>>> # Convert a UUID to a string of hex digits in standard form>>> str(uuid.uuid4())'f50ec0b7-f960-400d-91f0-c42a6d44e3d0'
>>> # Convert a UUID to a 32-character hexadecimal string>>> uuid.uuid4().hex'9fe2c4e93f654fdbb24c02b15259716c'

如果您使用的是Python 2.5或更高版本,则uuid模块已经包含在Python标准发行版中。

例如:

>>> import uuid>>> uuid.uuid4()UUID('5361a11b-615c-42bf-9bdb-e2c3790ada14')

我使用GUID作为数据库类型操作的随机键。

十六进制形式的破折号和额外字符对我来说似乎不必要地长。但我也喜欢表示十六进制数字的字符串非常安全,因为它们不包含在某些情况下可能导致问题的字符,例如 '+','=', 等。

而不是十六进制,我使用url安全的bas64字符串。以下不符合任何UUID /GUID规范(除了具有所需的随机性)。

import base64import uuid
# get a UUID - URL safe, Base64def get_a_uuid():r_uuid = base64.urlsafe_b64encode(uuid.uuid4().bytes)return r_uuid.replace('=', '')

复制自:https://docs.python.org/3/library/uuid.html(由于发布的链接不活跃,并且不断更新)

>>> import 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')

此函数完全可配置,并根据指定的格式生成唯一的uid

例如:-[8,4,4,4,12],这是提到的格式,它将生成以下uuid

L x oY NyX e-7 h bQ-caJ t-DS dU-PDA ht 56 c MEW i

 import random as r
def generate_uuid():random_string = ''random_str_seq = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"uuid_format = [8, 4, 4, 4, 12]for n in uuid_format:for i in range(0,n):random_string += str(random_str_seq[r.randint(0, len(random_str_seq) - 1)])if n != 12:random_string += '-'return random_string

如果您需要UUID为您的模型或唯一字段传递主键,那么下面的代码将返回UUID对象-

 import uuiduuid.uuid4()

如果你需要传递UUID作为URL的参数,你可以像下面的代码-

import uuidstr(uuid.uuid4())

如果你想要一个UUID的十六进制值,你可以做下面的-

import uuiduuid.uuid4().hex

2019答案(适用于Windows):

如果你想要一个在Windows上唯一标识机器的永久UUID,你可以使用这个技巧:(复制自我的答案https://stackoverflow.com/a/58416992/8874388)。

from typing import Optionalimport reimport subprocessimport uuid
def get_windows_uuid() -> Optional[uuid.UUID]:try:# Ask Windows for the device's permanent UUID. Throws if command missing/fails.txt = subprocess.check_output("wmic csproduct get uuid").decode()
# Attempt to extract the UUID from the command's result.match = re.search(r"\bUUID\b[\s\r\n]+([^\s\r\n]+)", txt)if match is not None:txt = match.group(1)if txt is not None:# Remove the surrounding whitespace (newlines, space, etc)# and useless dashes etc, by only keeping hex (0-9 A-F) chars.txt = re.sub(r"[^0-9A-Fa-f]+", "", txt)
# Ensure we have exactly 32 characters (16 bytes).if len(txt) == 32:return uuid.UUID(txt)except:pass # Silence subprocess exception.
return None
print(get_windows_uuid())

使用Windows API获取计算机的永久UUID,然后处理字符串以确保它是有效的UUID,最后返回一个Python对象(https://docs.python.org/3/library/uuid.html),它为您提供了使用数据的方便方法(例如128位整数,十六进制字符串等)。

祝你好运!

PS:子进程调用可能可以替换为直接调用Windows内核/DLL的ctype。但就我的目的而言,这个函数就是我所需要的。它进行强大的验证并产生正确的结果。

如果您正在制作一个网站或应用程序,您每次都需要一个唯一的ID。它应该是一个字符串一个数字,那么UUID是一个很棒的python包,它有助于创建一个唯一的ID。

**pip install uuid**
import uuid
def get_uuid_id():return str(uuid.uuid4())
print(get_uuid_id())

输出示例:89e5b891-cf2c-4396-8d1c-49be7f2ee02d

运行此命令:

pip install uuid uuid6

然后运行,您可以从uuid包中导入uuid1uuid3uuid4uuid5函数,从uuid6包中导入uuid6uuid7函数。

调用这些函数的示例输出如下(除了需要参数的uuid3uuid5):

>>> import uuid, uuid6>>> print(*(str(i()) for i in [uuid.uuid1, uuid.uuid4, uuid6.uuid6, uuid6.uuid7]), sep="\n")646e934b-f20c-11ec-ad9f-54a1500ef01b560e2227-c738-41d9-ad5a-bbed6a3bc2731ecf20b6-46e9-634b-9e48-b2b9e6010c5701818aa2-ec45-74e8-1f85-9d74e4846897