Как определить, является ли строка допустимым идентификатором UUID v4?


Я создаю валидатор на основе UUID, сгенерированного браузером клиента, я использую его для идентификации данных определенного типа, которые отправляет пользователь; и хотел бы проверить, что UUID, который отправляет клиент, на самом деле является действительной версией 4 UUID.

Я нашел это PHP preg_match UUID v4, это близко, но не совсем то, что я ищу. я хочу знать, существует ли что-то похожее на is_empty() или strtodate(), где, если строка недопустима, отправляет FALSE.

Я мог бы сделать основано на регулярном выражении, но я хотел бы что-то более родное, чтобы протестировать его.

Есть идеи?

Author: Ωmega, 2013-11-15

4 answers

UUID версии 4 имеют вид xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx, где x - любая шестнадцатеричная цифра, а y - одна из 8, 9, A, или B.

^[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');
 55
Author: Ωmega, 2017-02-27 15:08:48

Я нашел этот вопрос, когда искал ответ на Python. Чтобы помочь людям в такой же ситуации, я добавил решение Python.

Вы можете использовать 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:
        return False

    return str(uuid_obj) == uuid_to_test


if __name__ == '__main__':
    import doctest
    doctest.testmod()
 22
Author: Martin Thoma, 2015-10-28 20:50:50
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
 4
Author: Andrey Shipilov, 2016-06-30 02:58:46

Если вам это нужно только для безопасности (например, если вам нужно распечатать его в коде javascript и вы хотите избежать XSS), на самом деле не имеет значения положение тире, поэтому просто:

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

Https://regex101.com/r/MDqB2Z/1

 2
Author: the_nuts, 2017-06-28 15:13:07