Skip to content

Instantly share code, notes, and snippets.

@ShawnMilo
Created December 3, 2013 20:55
Show Gist options
  • Save ShawnMilo/7777304 to your computer and use it in GitHub Desktop.
Save ShawnMilo/7777304 to your computer and use it in GitHub Desktop.
Validating a uuid4 with Python.
from uuid import UUID
def validate_uuid4(uuid_string):
"""
Validate that a UUID string is in
fact a valid uuid4.
Happily, the uuid module does the actual
checking for us.
It is vital that the 'version' kwarg be passed
to the UUID() call, otherwise any 32-character
hex string is considered valid.
"""
try:
val = UUID(uuid_string, version=4)
except ValueError:
# If it's a value error, then the string
# is not a valid hex code for a UUID.
return False
# If the uuid_string is a valid hex code,
# but an invalid uuid4,
# the UUID.__init__ will convert it to a
# valid uuid4. This is bad for validation purposes.
return val.hex == uuid_string
if __name__ == '__main__':
# Valid uuid, generated by uuid4():
x = '89eb35868a8247a4a911758a62601cf7'
print validate_uuid4(x)
# Same as above, except for the 17th charecter
# which is a valid hex string, but not a valid uuid4.
x = '89eb35868a8247a4c911758a62601cf7'
print validate_uuid4(x)
@craig8
Copy link

craig8 commented Jun 28, 2016

so str(uuid.uuid4()) returns b514af82-3c4f-4bb5-b1da-a89a0ced5e6f, however this is not the same as the hex version. so using the following test code will not work.

    assert validate_uuid4(uuid.uuid4())

@joncnet
Copy link

joncnet commented Jul 1, 2016

craig8 is right, I just changed the last function line with:

return val.hex == uuid_string.replace('-', '')

and now it works

@khpeek
Copy link

khpeek commented Jan 13, 2017

A ValueError is not the only type of exception UUID can throw. For example, if you try UUID(0), it will produce an AttributeError. Assuming you want the function to return False in this case (since 0 is clearly not a valid UUID4), you could consider replace except ValueError with except Exception.

@ev-agelos
Copy link

@khpeek you are right but in his function he explicitly expects a string

@dosentmatter
Copy link

I think val == UUID(uuid_string) would work the best. No need to get .hex() or do any string replacements. The reason to use UUID(uuid_string) without the version kwarg is so it would work with the other formats UUID allows too like curly braces and urn prefixes. These extraneous parts of the string are removed by UUID.init().

val is possibly converted to uuid4.
UUID(uuid_string) is just the hex string as is with no conversion.

I guess this gist just expects only hex strings as input.

@ipanousis
Copy link

I would just replace the return val.hex == uuid_string with return str(val) == uuid_string

@apostoloss
Copy link

would it make sense to .lower() the string before comparing it? (just in case)

@ra-tolson
Copy link

@apostolos Sure, validators typical tell you whether and object passes some criteria; cleaning or scrubbing your inputs is where you massage things to give the user a break on things like capitalization. Then you validate the massaged version.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment