पायथन में GUID / UUID कैसे बनाएं


686

मैं पायथन में एक GUID कैसे बनाऊं जो प्लेटफ़ॉर्म स्वतंत्र हो? मैंने सुना है कि विंडोज पर ActivePython का उपयोग करने की एक विधि है, लेकिन यह केवल Windows है क्योंकि यह COM का उपयोग करता है। क्या सादा अजगर का उपयोग करने की कोई विधि है?



34
पवित्र है कि सभी के प्यार के लिए, यह एक UUID है - यूनिवर्सल यूनिक आईडी en.wikipedia.org/wiki/Universally_unique_identifier - यह दुर्भाग्य से एमएस ने GUID को प्राथमिकता दी है।
david.barkhuizen

5
यहाँ आपके लिए एक लाइनर है:python -c 'import uuid; print(uuid.uuid4())'
Ctrl-C

जवाबों:


776

UUID मॉड्यूल, Python 2.5 और अप में, RFC अनुपालन UUID पीढ़ी प्रदान करता है। विवरण के लिए मॉड्यूल डॉक्स और RFC देखें। [ स्रोत ]

डॉक्स:

उदाहरण (2 और 3 पर काम करना):

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

20
इसके अलावा, shortuuidमेरे द्वारा लिखे गए मॉड्यूल पर एक नज़र डालें , क्योंकि यह आपको छोटे, पठनीय UUIDs उत्पन्न करने की अनुमति देता है: github.com/stochastic-technologies/shortuuid
स्टावरोस कोरोकिथिस

2
@StavrosKorokithakis: क्या आपने पायथन 3.x के लिए किसी भी संयोग से शॉर्ट्यूड मॉड्यूल लिखा है?
पटेल

2
@JayPatel क्या पायथॉन 3 के लिए शॉर्टूइड काम नहीं करता है? यदि नहीं, तो कृपया बग दर्ज करें।
स्टावरोस कोरोकिटाकिस

1
बीच क्या अंतर है uuid4().hexऔर str(uuid4())?
केविन

6
ठीक है, जैसा कि आप ऊपर देख सकते हैं, str(uuid4())शामिल किए गए डैश के साथ UUID का एक स्ट्रिंग प्रतिनिधित्व uuid4().hexदेता है , जबकि "32-वर्ण हेक्साडेसिमल स्ट्रिंग के रूप में UUID"
स्टुअर्ट

324

यदि आप पायथन 2.5 या उसके बाद का उपयोग कर रहे हैं, तो uuid मॉड्यूल पहले से ही पायथन मानक वितरण के साथ शामिल है।

उदाहरण के लिए:

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

116

से कॉपी किया गया: https://docs.python.org/2/library/uuid.html (चूंकि पोस्ट किए गए लिंक सक्रिय नहीं थे और वे अपडेट करते रहते हैं)

>>> 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 का उपयोग करता हूं।

हेक्साडेसिमल रूप, डैश और अतिरिक्त पात्रों के साथ मुझे अनावश्यक रूप से लंबा लगता है। लेकिन मुझे यह भी पसंद है कि हेक्साडेसिमल संख्याओं का प्रतिनिधित्व करने वाले तार बहुत सुरक्षित हैं कि उनमें ऐसे चरित्र नहीं हैं जो कुछ स्थितियों जैसे '+', '=' आदि में समस्या पैदा कर सकते हैं।

हेक्साडेसिमल के बजाय, मैं एक यूआरएल-सुरक्षित बेस 64 स्ट्रिंग का उपयोग करता हूं। निम्नलिखित हालांकि किसी भी UUID / GUID युक्ति के अनुरूप नहीं है (यादृच्छिकता की आवश्यक राशि होने के अलावा)।

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
यदि आप इसे किसी भी यूयूआईडी संदर्भों में उपयोग करने के लिए परेशान नहीं कर रहे हैं, तो आप बस random.getrandbits(128).to_bytes(16, 'little')(या क्रिप्टो यादृच्छिकता के लिए) का उपयोग कर सकते हैं os.urandom(16)और यादृच्छिक 128 बिट्स प्राप्त कर सकते हैं (यूयूआईडीवी 4 संस्करण जानकारी पर 6-7 बिट्स का उपयोग करता है)। या केवल 15 बाइट्स का उपयोग करें (यादृच्छिक बनाम UUIDv4 के 1-2 बिट्स को खोने) और =संकेतों को ट्रिम करने की आवश्यकता से बचें, जबकि एन्कोडेड आकार को 20 बाइट्स (24 से 22 तक छंटनी) को कम करने के लिए, 3 बाइट्स के किसी भी एकाधिक के रूप में एन्कोड करें आधार #bytes / 3 * 464 वर्णों के लिए कोई पैडिंग आवश्यक नहीं है।
शैडो रेंजर

@ShadowRanger हाँ मूल रूप से विचार है। 128 रैंडम बिट्स, जहां तक ​​संभव हो, URL सुरक्षित होने के साथ-साथ कम से कम संभव हो। आदर्श रूप में यह केवल ऊपरी और निचले मामले के अक्षरों और फिर संख्याओं का उपयोग करेगा। तो मुझे लगता है कि एक बेस -62 स्ट्रिंग है।
क्रिस डुट्रो

जब मैं आपके फ़ंक्शन का उपयोग करता हूं तो मुझे returnबाइट्स जैसी ऑब्जेक्ट की अपेक्षा करने वाले कथन से एक प्रकार की त्रुटि मिलती है । इसके साथ तय किया जा सकता है return str(r_uuid).replace('=','')
मार्क Kortink

8

यदि आपको अपने मॉडल या अद्वितीय फ़ील्ड के लिए प्राथमिक कुंजी के लिए UUID को पास करने की आवश्यकता है, तो कोड UUID ऑब्जेक्ट को लौटाता है -

 import uuid
 uuid.uuid4()

यदि आपको URL के पैरामीटर के रूप में UUID पास करने की आवश्यकता है, तो आप नीचे दिए गए कोड की तरह कर सकते हैं -

import uuid
str(uuid.uuid4())

यदि आप एक UUID के लिए हेक्स मान चाहते हैं तो आप नीचे एक कर सकते हैं -

import uuid    
uuid.uuid4().hex

0

यह फ़ंक्शन पूरी तरह से कॉन्फ़िगर करने योग्य है और निर्दिष्ट प्रारूप के आधार पर अद्वितीय यूआईडी उत्पन्न करता है

उदाहरण: - [,, ४, ४, ४, १२], यह उल्लेखित प्रारूप है और यह निम्नलिखित यूइड उत्पन्न करेगा

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
UUIDs मानक हैं, और लंबाई में परिवर्तनशील नहीं हैं। विन्यास योग्य तरीके से एक यादृच्छिक स्ट्रिंग उत्पन्न करना कुछ स्थितियों में उपयोगी हो सकता है, लेकिन इस संदर्भ में नहीं। आप परिभाषा के लिए en.wikipedia.org/wiki/Universally_unique_identifier देख सकते हैं ।
मिग्वेल

2
इससे बचने के लिए बेहतर है कि आप संगतता के मुद्दों में भाग लें (ये मानक GUID नहीं हैं)
सिल्वेन गैंटोइस

-1

2019 उत्तर (विंडोज के लिए):

यदि आप एक स्थायी UUID चाहते हैं जो किसी मशीन को Windows पर विशिष्ट रूप से पहचानती है, तो आप इस ट्रिक का उपयोग कर सकते हैं: ( 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())

कंप्यूटर के स्थायी UUID को प्राप्त करने के लिए Windows API का उपयोग करता है, फिर यह सुनिश्चित करने के लिए स्ट्रिंग को संसाधित करता है कि यह एक मान्य UUID है, और अंत में एक Python ऑब्जेक्ट ( https://docs.python.org/3/library/uuid.html ) देता है जो आपको सुविधाजनक बनाता है डेटा का उपयोग करने के तरीके (जैसे 128-बिट पूर्णांक, हेक्स स्ट्रिंग, आदि)।

सौभाग्य!

पुनश्च: उपप्रकार कॉल को शायद विंडोज कर्नेल / डीएलएल को सीधे कॉल करने वाले ctypes से बदला जा सकता है। लेकिन मेरे उद्देश्यों के लिए यह फ़ंक्शन मेरी ज़रूरत है। यह मजबूत सत्यापन करता है और सही परिणाम पैदा करता है।


-1

चेक इस पोस्ट, मुझे एक बहुत मदद की। संक्षेप में, मेरे लिए सबसे अच्छा विकल्प था:

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

क्योंकि मुझे भारी GUID के बजाय सिर्फ 4-6 यादृच्छिक वर्णों की आवश्यकता थी।


यह सवाल पूरी तरह से असंबंधित लगता है, जो यूयूआईडी के बारे में है।
मोनिका
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.