Python'da bir GUID / UUID oluşturma


686

Python'da platformdan bağımsız bir GUID nasıl oluştururum? Windows'ta ActivePython kullanan bir yöntem olduğunu duyuyorum, ancak sadece COM kullandığından Windows. Düz Python kullanan bir yöntem var mı?



34
Kutsal olan her şeyin aşkı için, bir UUID - Evrensel Benzersiz Kimlik en.wikipedia.org/wiki/Universally_unique_identifier - maalesef MS GUID'yi tercih etti.
david.barkhuizen

5
İşte sizin için bir astar:python -c 'import uuid; print(uuid.uuid4())'
Ctrl-C

Yanıtlar:


776

Python 2.5 ve sonraki sürümlerde bulunan uuid modülü, RFC uyumlu UUID üretimi sağlar. Ayrıntılar için modül belgelerine ve RFC'ye bakın. [ kaynak ]

Dokümanlar:

Örnek (2 ve 3 üzerinde çalışma):

>>> import uuid
>>> uuid.uuid4()
UUID('bd65600d-8669-4903-8a14-af88203add38')
>>> str(uuid.uuid4())
'f50ec0b7-f960-400d-91f0-c42a6d44e3d0'
>>> uuid.uuid4().hex
'9fe2c4e93f654fdbb24c02b15259716c'

20
Ayrıca, shortuuiddaha kısa, okunabilir UUID'ler
Stavros Korokithakis 31:12

2
@StavrosKorokithakis: Python 3.x için kısa devre modülü yazdınız mı?
Jay Patel

2
@JayPatel Shortuuid Python 3 için çalışmıyor mu? Değilse, lütfen bir hata gönderin.
Stavros Korokithakis

1
Arasındaki fark nedir uuid4().hexve str(uuid4())?
Kevin

6
Yukarıda da görebileceğiniz gibi, str(uuid4())uuid4().hex
UUID'nin

324

Python 2.5 veya üstünü kullanıyorsanız, uuid modülü zaten Python standart dağıtımına dahildir.

Ör:

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

116

Kopyalandığı yer: https://docs.python.org/2/library/uuid.html (Gönderilen bağlantılar etkin olmadığından ve güncellenmeye devam ettiklerinden)

>>> 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')

28

GUID'leri veritabanı türü işlemleri için rasgele anahtarlar olarak kullanıyorum.

Çizgiler ve ekstra karakterler içeren onaltılık form gereksiz yere uzun görünüyor. Ancak onaltılık sayıları temsil eden dizelerin '+', '=' vb.

Onaltılık yerine, URL güvenli base64 dizesi kullanıyorum. Aşağıdakiler UUID / GUID spesifikasyonlarına uymuyor (gerekli rasgele miktarda olmak dışında).

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('=', '')

2
Herhangi bir UUID bağlamında kullanmak için uğraşmayacaksanız, sadece random.getrandbits(128).to_bytes(16, 'little')veya (kripto rasgeleliği için) kullanabilir os.urandom(16)ve tam bir 128 bit rastgele alabilirsiniz (UUIDv4 sürüm bilgisinde 6-7 bit kullanır). Veya sadece 15 bayt kullanın (UUIDv4'e karşı 1-2 bit rasgele kaybetme) ve =3 baytlık herhangi bir kodlamadan kodlanmış boyutu 20 bayta (24'ten 22'ye kırpılmış) düşürürken işaretleri kesme ihtiyacından kaçının. için #bytes / 3 * 4hiçbir dolgu ile base64 karakterleri gerektiriyordu.
ShadowRanger

@ShadowRanger Evet temelde fikir bu. 128 rastgele bit, mümkün olduğunca kısa ve URL güvenli. İdeal olarak, sadece büyük ve küçük harfler ve sonra sayılar kullanır. Bu yüzden bir baz-62 dize sanırım.
Chris Dutrow

Ben işlevini kullandığınızda returnbayt benzeri bir nesne bekliyor deyimden bir tür hatası alıyorum . İle sabitlenebilir return str(r_uuid).replace('=','').
Mark Kortink

8

Modeliniz veya benzersiz alanınız için birincil anahtar için UUID'yi iletmeniz gerekiyorsa aşağıdaki kod UUID nesnesini döndürür -

 import uuid
 uuid.uuid4()

URL için bir parametre olarak UUID'yi iletmeniz gerekiyorsa aşağıdaki kodu yapabilirsiniz -

import uuid
str(uuid.uuid4())

Bir UUID için onaltılı değer istiyorsanız, aşağıdakini yapabilirsiniz -

import uuid    
uuid.uuid4().hex

0

Bu işlev tamamen yapılandırılabilir ve belirtilen biçime göre benzersiz kullanıcı kimliği oluşturur

örneğin: - [8, 4, 4, 4, 12], bu belirtilen biçimdir ve aşağıdaki uuid'i oluşturur

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

3
UUID'ler standarttır ve uzunluk olarak değişken değildir. Yapılandırılabilir bir şekilde rastgele bir dize oluşturmak bazı durumlarda yararlı olabilir, ancak bu bağlamda kullanılamaz. Tanım için en.wikipedia.org/wiki/Universally_unique_identifier adresini kontrol edebilirsiniz .
miguelr

2
Bundan daha iyi kaçının ya da uyumluluk sorunlarıyla karşılaşabilirsiniz (bunlar standart GUID'ler değildir)
Sylvain Gantois

-1

2019 Cevabı (Windows için):

Bir makineyi Windows'ta benzersiz bir şekilde tanımlayan kalıcı bir UUID istiyorsanız, bu numarayı kullanabilirsiniz: ( https://stackoverflow.com/a/58416992/8874388 adresindeki yanıtımdan kopyalandı ).

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())

Bilgisayarın kalıcı UUID'sini almak için Windows API'sini kullanır, ardından geçerli bir UUID olduğundan emin olmak için dizeyi işler ve son olarak size uygun bir Python nesnesi ( https://docs.python.org/3/library/uuid.html ) döndürür verileri kullanma yolları (128 bit tam sayı, onaltılık dize, vb.).

İyi şanslar!

Not: Alt işlem çağrısı muhtemelen doğrudan Windows çekirdeği / DLL'lerini çağıran ctypes ile değiştirilebilir. Ama benim amacım için bu işlev ihtiyacım olan tek şey. Güçlü doğrulama yapar ve doğru sonuçlar üretir.


-1

Bu gönderiyi kontrol et , bana çok yardımcı oldu. Kısacası, benim için en iyi seçenek:

import random 
import string 

# defining function for random 
# string id with parameter 
def ran_gen(size, chars=string.ascii_uppercase + string.digits): 
    return ''.join(random.choice(chars) for x in range(size)) 

# function call for random string 
# generation with size 8 and string  
print (ran_gen(8, "AEIOSUMA23")) 

Çünkü hantal GUID yerine sadece 4-6 rastgele karaktere ihtiyacım vardı.


Bu, UUID'lerle ilgili soru ile tamamen ilgisiz görünüyor.
Monica ile sox
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.