wake-up-neo.com

Wie kann ich feststellen, ob eine Zeichenfolge eine gültige v4-UUID ist?

Ich mache einen Validierer basierend auf UUID , der vom Client-Browser generiert wurde. Ich benutze dies, um einen bestimmten Typ zu identifizieren, den der Benutzer sendet. und möchte bestätigen, dass die UUID, die der Client sendet, tatsächlich eine gültige Version 4UUID ist.

Ich habe diese PHP preg_match UUID v4 gefunden, es ist nah, aber nicht genau das, wonach ich suche. Ich möchte wissen, ob etwas Ähnliches wie is_empty() oder strtodate() existiert. Wenn der String nicht gültig ist, wird FALSE gesendet.

Ich könnte dies auf der Basis des regulären Ausdrucks tun, aber ich hätte gerne etwas mehr Muttersprache, um es zu testen.

Irgendwelche Ideen?

41
Rafael

UUIDs der Version 4 haben die Form xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx, wobei x eine beliebige hexadezimale Ziffer ist und y eine von 8, 9, A oder B ist.

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

Um Kleinbuchstaben zuzulassen, verwenden Sie den Modifizierer 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');
71
Ωmega

Ich habe diese Frage gefunden, als ich nach einer Python-Antwort suchte. Um Menschen in derselben Situation zu helfen, habe ich die Lösung Python hinzugefügt.

Sie können das Modul uuid verwenden:

#!/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 __== '__main__':
    import doctest
    doctest.testmod()
27
Martin Thoma
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
Andrey Shipilov

Wenn Sie es nur aus Sicherheitsgründen benötigen (wenn Sie es beispielsweise in einem JavaScript-Code drucken müssen und XSS vermeiden möchten), spielt es keine Rolle, an welcher Position die Striche stehen.

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

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

2
the_nuts

Alle vorhandenen Antworten verwenden regex. Wenn Sie Python verwenden, sollten Sie einen try/except in Betracht ziehen, wenn Sie regex nicht verwenden möchten: (etwas kürzer als die Antwort oben).

Unser Validator wäre dann:

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
1
slajma