如何确定一个字符串是否是有效的 v4 UUID?

我正在制作一个基于客户端浏览器生成的 UUID的验证器,我使用它来识别用户发送的特定类型的数据; 并希望验证客户端发送的 UUID实际上是一个有效的 第四版 UUID

我找到了这个 PHP preg _ match UUID v4很接近,但不是我要找的。我希望知道是否存在类似于 is_empty()strtodate()的东西,如果字符串不是有效的发送 FALSE

我可以基于正则表达式进行测试,但我希望使用更原生的方法来测试它。

有什么想法吗?

140878 次浏览

版本4的 UUID 具有 xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx形式,其中 x是任何十六进制数字,而 y89AB之一。

^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$

允许小写字母,使用 i修饰符→

$UUIDv4 = '/^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i';
preg_match($UUIDv4, $value) or die('Not valid UUID');

I found this question while I was looking for a Python answer. To help people in the same situation, I've added the 巨蟒 solution.

你可以使用 uuid模块:

#!/usr/bin/env python


from uuid import UUID


def is_valid_uuid(uuid_to_test, version=4):
"""
Check if uuid_to_test is a valid UUID.
    

Parameters
----------
uuid_to_test : str
version : {1, 2, 3, 4}
    

Returns
-------
`True` if uuid_to_test is a valid UUID, otherwise `False`.
    

Examples
--------
>>> is_valid_uuid('c9bf9e57-1685-4c89-bafb-ff5af830be8a')
True
>>> is_valid_uuid('c9bf9e58')
False
"""
    

try:
uuid_obj = UUID(uuid_to_test, version=version)
except ValueError:
return False
return str(uuid_obj) == uuid_to_test




if __name__ == '__main__':
import doctest
doctest.testmod()
import re


UUID_PATTERN = re.compile(r'^[\da-f]{8}-([\da-f]{4}-){3}[\da-f]{12}$', re.IGNORECASE)
uuid = '20f5484b-88ae-49b0-8af0-3a389b4917dd'


if UUID_PATTERN.match(uuid):
return True
else:
return False

如果你只是为了安全需要它(例如,如果你需要打印一个 javascript 代码,你想避免 XSS) ,破折号的位置并不重要,所以它只是:

 /^[a-f0-9\-]{36}$/i

Https://regex101.com/r/mdqb2z/11


(它并不特定于 v4,但通常一个编写良好的应用程序在删除破折号之后将它们存储为 BINARY (16) ,所以如果有什么错误,它只是不会找到对象并抛出404,可能不需要过度验证)。

所有现有的答案都使用正则表达式。如果您正在使用 巨蟒,那么您可能需要考虑使用 try/except,以防您不想使用正则表达式: (比上面的答案短一点)。

我们的验证器就是:

import uuid


def is_valid_uuid(val):
try:
uuid.UUID(str(val))
return True
except ValueError:
return False


>>> is_valid_uuid(1)
False
>>> is_valid_uuid("123-UUID-wannabe")
False
>>> is_valid_uuid({"A":"b"})
False
>>> is_valid_uuid([1, 2, 3])
False
>>> is_valid_uuid(uuid.uuid4())
True
>>> is_valid_uuid(str(uuid.uuid4()))
True
>>> is_valid_uuid(uuid.uuid4().hex)
True
>>> is_valid_uuid(uuid.uuid3(uuid.NAMESPACE_DNS, 'example.net'))
True
>>> is_valid_uuid(uuid.uuid5(uuid.NAMESPACE_DNS, 'example.net'))
True
>>> is_valid_uuid("{20f5484b-88ae-49b0-8af0-3a389b4917dd}")
True
>>> is_valid_uuid("20f5484b88ae49b08af03a389b4917dd")
True