How do I create a GUID/UUID 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?
-
5http://docs.activestate.com/activepython/2.6/python/library/uuid.html – Sridhar Ratnakumar Jan 20 '10 at 17:25
-
80For the love of all that is sacred, it's a UUID - Universal Unique ID http://en.wikipedia.org/wiki/Universally_unique_identifier - its just that unfortunately MS has preferrred GUID. – david.barkhuizen Mar 16 '13 at 20:02
-
12Here's one liner for you: `python -c 'import uuid; print(uuid.uuid4())'` – Ctrl-C Apr 24 '17 at 10:04
-
9I think GUID makes more sense than UUID, as global means global within some namespace, while universal seems to claim true universal uniqueness. In any event we all know what we're talking about here. – duhaime Oct 28 '20 at 12:39
-
what is a guid and a uuid? why not create a unique hash id e.g. https://stackoverflow.com/questions/22974499/generate-id-from-string-in-python – Charlie Parker Jul 25 '22 at 19:09
-
It is the same thing, people. The RFC 4122 even says UUID is also known as GUID. GUID is easier and more fun to say. ;-) – Darryl Wagoner WA1GON Sep 02 '23 at 22:46
8 Answers
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()
oruuid4()
. Note thatuuid1()
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'

- 70,509
- 14
- 132
- 163
-
51Also, have a look at the `shortuuid` module I wrote, as it allows you to generate shorter, readable UUIDs: https://github.com/stochastic-technologies/shortuuid – Stavros Korokithakis Dec 31 '12 at 16:22
-
4@StavrosKorokithakis: have you written shortuuid module for Python 3.x by any chance? – Jay Patel Aug 21 '16 at 23:06
-
3@JayPatel Does shortuuid not work for Python 3? If not, please file a bug. – Stavros Korokithakis Aug 22 '16 at 02:56
-
6
-
17Well, 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"_ – stuartd Jan 30 '18 at 10:08
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')

- 2,342
- 22
- 18

- 41,768
- 14
- 66
- 83
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('=', '')

- 48,402
- 65
- 188
- 258
-
4If 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. – ShadowRanger Jan 24 '19 at 02:26
-
@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. – Chris Dutrow Feb 15 '19 at 04:19
-
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('=','')```. – Mark Kortink Feb 18 '20 at 02:41
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

- 954
- 6
- 20
If you are making a website or app where you need to every time a unique id. It should be a string a number then UUID is a great package in python which is helping to create a unique id.
**pip install uuid**
import uuid
def get_uuid_id():
return str(uuid.uuid4())
print(get_uuid_id())
OUTPUT example: 89e5b891-cf2c-4396-8d1c-49be7f2ee02d

- 553
- 3
- 17
2019 Answer (for Windows):
If you want a permanent UUID that identifies a machine uniquely on Windows, you can use this trick: (Copied from my answer at https://stackoverflow.com/a/58416992/8874388).
from typing import Optional
import re
import subprocess
import uuid
def get_windows_uuid() -> Optional[uuid.UUID]:
try:
# Ask Windows for the device's permanent UUID. Throws if command missing/fails.
txt = subprocess.check_output("wmic csproduct get uuid").decode()
# Attempt to extract the UUID from the command's result.
match = re.search(r"\bUUID\b[\s\r\n]+([^\s\r\n]+)", txt)
if match is not None:
txt = match.group(1)
if txt is not None:
# Remove the surrounding whitespace (newlines, space, etc)
# and useless dashes etc, by only keeping hex (0-9 A-F) chars.
txt = re.sub(r"[^0-9A-Fa-f]+", "", txt)
# Ensure we have exactly 32 characters (16 bytes).
if len(txt) == 32:
return uuid.UUID(txt)
except:
pass # Silence subprocess exception.
return None
print(get_windows_uuid())
Uses Windows API to get the computer's permanent UUID, then processes the string to ensure it's a valid UUID, and lastly returns a Python object (https://docs.python.org/3/library/uuid.html) which gives you convenient ways to use the data (such as 128-bit integer, hex string, etc).
Good luck!
PS: The subprocess call could probably be replaced with ctypes directly calling Windows kernel/DLLs. But for my purposes this function is all I need. It does strong validation and produces correct results.

- 3,634
- 28
- 27
Run this command:
pip install uuid uuid6
And then run you can import uuid1
, uuid3
, uuid4
and uuid5
functions from the uuid
package, and uuid6
and uuid7
functions from the uuid6
package.
An example output of calling each of these functions is as follows (except uuid3
and uuid5
which require parameters):
>>> import uuid, uuid6
>>> print(*(str(i()) for i in [uuid.uuid1, uuid.uuid4, uuid6.uuid6, uuid6.uuid7]), sep="\n")
646e934b-f20c-11ec-ad9f-54a1500ef01b
560e2227-c738-41d9-ad5a-bbed6a3bc273
1ecf20b6-46e9-634b-9e48-b2b9e6010c57
01818aa2-ec45-74e8-1f85-9d74e4846897

- 310
- 1
- 13
This function is fully configurable and generates unique uid based on the format specified
eg:- [8, 4, 4, 4, 12] , this is the format mentioned and it will generate the following uuid
LxoYNyXe-7hbQ-caJt-DSdU-PDAht56cMEWi
import random as r
def generate_uuid():
random_string = ''
random_str_seq = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
uuid_format = [8, 4, 4, 4, 12]
for n in uuid_format:
for i in range(0,n):
random_string += str(random_str_seq[r.randint(0, len(random_str_seq) - 1)])
if n != 12:
random_string += '-'
return random_string

- 2,247
- 24
- 20
-
6UUIDs 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 https://en.wikipedia.org/wiki/Universally_unique_identifier for definition. – miguelr Jan 29 '19 at 02:12
-
7Better avoid this one or you might run into compatibility issues (these are not standard GUIDs) – Sylvain Gantois Sep 10 '19 at 03:56
-
3Also, not even remotely guaranteed to be unique. It may be random, but not unique. – regretoverflow Dec 14 '20 at 20:07
-
2@regretoverflow No GUIDs are ever unique, simply so massive that a collision is extremely unlikely. – Austin Heller Jun 27 '21 at 08:05
-
1GUID is a string representation of a very long number so 'LxoYNyXe...' does not cut in. – user2555515 Mar 03 '22 at 21:30