Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to generate a random UUID which is reproducible (with a seed) in Python

The uuid4() function of Python's module uuid generates a random UUID, and seems to generate a different one every time:

In [1]: import uuid  In [2]: uuid.uuid4() Out[2]: UUID('f6c9ad6c-eea0-4049-a7c5-56253bc3e9c0')  In [3]: uuid.uuid4() Out[3]: UUID('2fc1b6f9-9052-4564-9be0-777e790af58f') 

I would like to be able to generate the same random UUID every time I run a script - that is, I'd like to seed the random generator in uuid4(). Is there a way to do this? (Or achieve this by some other means)?

What I've tried so far

I've to generate a UUID using the uuid.UUID() method with a random 128-bit integer (from a seeded instance of random.Random()) as input:

import uuid import random  rd = random.Random() rd.seed(0) uuid.UUID(rd.getrandbits(128)) 

However, UUID() seems not to accept this as input:

Traceback (most recent call last):   File "uuid_gen_seed.py", line 6, in <module>     uuid.UUID(rd.getrandbits(128))   File "/usr/lib/python2.7/uuid.py", line 133, in __init__     hex = hex.replace('urn:', '').replace('uuid:', '') AttributeError: 'long' object has no attribute 'replace' 

Any other suggestions?

like image 278
Kurt Peek Avatar asked Dec 16 '16 14:12

Kurt Peek


People also ask

How do you generate the same UUID in Python?

You can create duplicates UUIDs by creating more 16384 uuid1 in less than 100ns. Don't use uuid1 when you don't want to make the MAC address of your machine visible. UUID4() uses the cryptographically secure random number generator to generate UUID. uuid4() generates a random UUID.

How do you generate multiple UUIDs in Python?

The uuid module provides immutable UUID objects (the UUID class) and the functions uuid1() , uuid3() , uuid4() , uuid5() for generating version 1, 3, 4, and 5 UUIDs as specified in RFC 4122. If all you want is a unique ID, you should probably call uuid1() or uuid4() .


1 Answers

Almost there:

uuid.UUID(int=rd.getrandbits(128)) 

This was determined with the help of help:

>>> help(uuid.UUID.__init__) Help on method __init__ in module uuid:  __init__(self, hex=None, bytes=None, bytes_le=None, fields=None, int=None, version=None) unbound uuid.UUID method     Create a UUID from either a string of 32 hexadecimal digits,     a string of 16 bytes as the 'bytes' argument, a string of 16 bytes     in little-endian order as the 'bytes_le' argument, a tuple of six     integers (32-bit time_low, 16-bit time_mid, 16-bit time_hi_version,     8-bit clock_seq_hi_variant, 8-bit clock_seq_low, 48-bit node) as     the 'fields' argument, or a single 128-bit integer as the 'int'     argument.  When a string of hex digits is given, curly braces,     hyphens, and a URN prefix are all optional.  For example, these     expressions all yield the same UUID:      UUID('{12345678-1234-5678-1234-567812345678}')     UUID('12345678123456781234567812345678')     UUID('urn:uuid:12345678-1234-5678-1234-567812345678')     UUID(bytes='\x12\x34\x56\x78'*4)     UUID(bytes_le='\x78\x56\x34\x12\x34\x12\x78\x56' +                   '\x12\x34\x56\x78\x12\x34\x56\x78')     UUID(fields=(0x12345678, 0x1234, 0x5678, 0x12, 0x34, 0x567812345678))     UUID(int=0x12345678123456781234567812345678)      Exactly one of 'hex', 'bytes', 'bytes_le', 'fields', or 'int' must     be given.  The 'version' argument is optional; if given, the resulting     UUID will have its variant and version set according to RFC 4122,     overriding the given 'hex', 'bytes', 'bytes_le', 'fields', or 'int'. 
like image 137
Alex Hall Avatar answered Sep 30 '22 13:09

Alex Hall