How to create a GUID/UUID in Python

前端 未结 8 1032
情话喂你
情话喂你 2020-11-22 16:47

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

相关标签:
8条回答
  • 2020-11-22 17:17

    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')
    
    0 讨论(0)
  • 2020-11-22 17:22

    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
    
    0 讨论(0)
  • 2020-11-22 17:23

    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.

    0 讨论(0)
  • 2020-11-22 17:28

    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
    
    0 讨论(0)
  • 2020-11-22 17:35

    The uuid module, in Python 2.5 and up, provides RFC compliant UUID generation. See the module docs and the RFC for details. [source]

    Docs:

    • Python 2: http://docs.python.org/2/library/uuid.html
    • Python 3: https://docs.python.org/3/library/uuid.html

    Example (working on 2 and 3):

    >>> import uuid
    >>> uuid.uuid4()
    UUID('bd65600d-8669-4903-8a14-af88203add38')
    >>> str(uuid.uuid4())
    'f50ec0b7-f960-400d-91f0-c42a6d44e3d0'
    >>> uuid.uuid4().hex
    '9fe2c4e93f654fdbb24c02b15259716c'
    
    0 讨论(0)
  • 2020-11-22 17:35

    Copied from : https://docs.python.org/2/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')
    
    0 讨论(0)
提交回复
热议问题