How to create a GUID/UUID in Python

764,094

Solution 1

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(). Note that uuid1() may compromise privacy since it creates a UUID containing the computer’s network address. uuid4() creates a random UUID.

UUID versions 6 and 7 - new Universally Unique Identifier (UUID) formats for use in modern applications and databases (draft) rfc - are available from https://pypi.org/project/uuid6/

Docs:

Examples (for both Python 2 and 3):

>>> import uuid

>>> # make a random UUID
>>> uuid.uuid4()
UUID('bd65600d-8669-4903-8a14-af88203add38')

>>> # Convert a UUID to a string of hex digits in standard form
>>> str(uuid.uuid4())
'f50ec0b7-f960-400d-91f0-c42a6d44e3d0'

>>> # Convert a UUID to a 32-character hexadecimal string
>>> uuid.uuid4().hex
'9fe2c4e93f654fdbb24c02b15259716c'

Solution 2

If you're using Python 2.5 or later, the uuid module is already included with the Python standard distribution.

Ex:

>>> import uuid
>>> uuid.uuid4()
UUID('5361a11b-615c-42bf-9bdb-e2c3790ada14')

Solution 3

Copied from : https://docs.python.org/3/library/uuid.html (Since the links posted were not active and they keep updating)

>>> import uuid

>>> # make a UUID based on the host ID and current time
>>> uuid.uuid1()
UUID('a8098c1a-f86e-11da-bd1a-00112444be1e')

>>> # make a UUID using an MD5 hash of a namespace UUID and a name
>>> uuid.uuid3(uuid.NAMESPACE_DNS, 'python.org')
UUID('6fa459ea-ee8a-3ca4-894e-db77e160355e')

>>> # make a random UUID
>>> uuid.uuid4()
UUID('16fd2706-8baf-433b-82eb-8c7fada847da')

>>> # make a UUID using a SHA-1 hash of a namespace UUID and a name
>>> uuid.uuid5(uuid.NAMESPACE_DNS, 'python.org')
UUID('886313e1-3b8a-5372-9b90-0c9aee199e5d')

>>> # make a UUID from a string of hex digits (braces and hyphens ignored)
>>> x = uuid.UUID('{00010203-0405-0607-0809-0a0b0c0d0e0f}')

>>> # convert a UUID to a string of hex digits in standard form
>>> str(x)
'00010203-0405-0607-0809-0a0b0c0d0e0f'

>>> # get the raw 16 bytes of the UUID
>>> x.bytes
'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f'

>>> # make a UUID from a 16-byte string
>>> uuid.UUID(bytes=x.bytes)
UUID('00010203-0405-0607-0809-0a0b0c0d0e0f')

Solution 4

I use GUIDs as random keys for database type operations.

The hexadecimal form, with the dashes and extra characters seem unnecessarily long to me. But I also like that strings representing hexadecimal numbers are very safe in that they do not contain characters that can cause problems in some situations such as '+','=', etc..

Instead of hexadecimal, I use a url-safe base64 string. The following does not conform to any UUID/GUID spec though (other than having the required amount of randomness).

import base64
import uuid

# get a UUID - URL safe, Base64
def get_a_uuid():
    r_uuid = base64.urlsafe_b64encode(uuid.uuid4().bytes)
    return r_uuid.replace('=', '')

Solution 5

If you need to pass UUID for a primary key for your model or unique field then below code returns the UUID object -

 import uuid
 uuid.uuid4()

If you need to pass UUID as a parameter for URL you can do like below code -

import uuid
str(uuid.uuid4())

If you want the hex value for a UUID you can do the below one -

import uuid    
uuid.uuid4().hex
Share:
764,094
Jonathon Watney
Author by

Jonathon Watney

Web developer, a lot of end-to-end stuff. twitter.com/jonathonwatney

Updated on April 29, 2022

Comments

  • Jonathon Watney
    Jonathon Watney about 2 years

    How do I create a GUID in Python that is platform independent? I hear there is a method using ActivePython on Windows but it's Windows only because it uses COM. Is there a method using plain Python?

    • Sridhar Ratnakumar
      Sridhar Ratnakumar over 14 years
    • david.barkhuizen
      david.barkhuizen about 11 years
      For the love of all that is sacred, it's a UUID - Universal Unique ID en.wikipedia.org/wiki/Universally_unique_identifier - its just that unfortunately MS has preferrred GUID.
    • Ctrl-C
      Ctrl-C about 7 years
      Here's one liner for you: python -c 'import uuid; print(uuid.uuid4())'
    • duhaime
      duhaime over 3 years
      I think GUID makes more sense than UUID, as <i>global</i> means global within some namespace, while <i>universal</i> seems to claim true universal uniqueness. In any event we all know what we're talking about here.
  • Stavros Korokithakis
    Stavros Korokithakis over 11 years
    Also, have a look at the shortuuid module I wrote, as it allows you to generate shorter, readable UUIDs: github.com/stochastic-technologies/shortuuid
  • Jay Patel
    Jay Patel over 7 years
    @StavrosKorokithakis: have you written shortuuid module for Python 3.x by any chance?
  • Stavros Korokithakis
    Stavros Korokithakis over 7 years
    @JayPatel Does shortuuid not work for Python 3? If not, please file a bug.
  • Kevin
    Kevin over 6 years
    What's the difference between uuid4().hex and str(uuid4())?
  • stuartd
    stuartd over 6 years
    Well, as you can see above, str(uuid4()) returns a string representation of the UUID with the dashes included, while uuid4().hex returns "The UUID as a 32-character hexadecimal string"
  • ShadowRanger
    ShadowRanger over 5 years
    If you're not going to bother using it in any UUID contexts, you may as well just use random.getrandbits(128).to_bytes(16, 'little') or (for crypto randomness) os.urandom(16) and get a full 128 bits of random (UUIDv4 uses 6-7 bits on version info). Or use only 15 bytes (losing 1-2 bits of random vs. UUIDv4) and avoid the need to trim off = signs while also reducing the encoded size to 20 bytes (from 24, trimmed to 22), as any multiple of 3 bytes encodes to #bytes / 3 * 4 base64 characters with no padding required.
  • miguelr
    miguelr over 5 years
    UUIDs are standard, and not variable in length. Generating a random string in a configurable way can be useful in some situations, but not in this context. You may check en.wikipedia.org/wiki/Universally_unique_identifier for definition.
  • Chris Dutrow
    Chris Dutrow over 5 years
    @ShadowRanger Yeah thats basically the idea. 128 random bits, as short as conveniently possible, while also being URL safe. Ideally it would only use upper and lower case letters and then numbers. So I guess a base-62 string.
  • Sylvain Gantois
    Sylvain Gantois over 4 years
    Better avoid this one or you might run into compatibility issues (these are not standard GUIDs)
  • Mark Kortink
    Mark Kortink about 4 years
    When i use your function i get a type error from the return statement expecting a bytes-like object. It can be fixed with return str(r_uuid).replace('=','').
  • sox with Monica
    sox with Monica about 4 years
    This seems completely unrelated to the question, which is about UUIDs.
  • regretoverflow
    regretoverflow over 3 years
    Also, not even remotely guaranteed to be unique. It may be random, but not unique.
  • Austin Heller
    Austin Heller almost 3 years
    @regretoverflow No GUIDs are ever unique, simply so massive that a collision is extremely unlikely.
  • user2555515
    user2555515 about 2 years
    GUID is a string representation of a very long number so 'LxoYNyXe...' does not cut in.