পাইথনে একটি জিইউইডি / ইউইউডি কীভাবে তৈরি করবেন


686

আমি পাইথনে এমন একটি জিআইডি তৈরি করব যা প্ল্যাটফর্মটি স্বতন্ত্র? আমি শুনেছি উইন্ডোজটিতে অ্যাক্টিভ পাইথন ব্যবহার করার একটি পদ্ধতি রয়েছে তবে এটি উইন্ডোজ কেবল সিওএম ব্যবহার করার কারণে। প্লেইন পাইথন ব্যবহার করার কোনও পদ্ধতি আছে?



34
ইউনিভার্সাল স্বতন্ত্র আইডি - সব যে পবিত্র ভালবাসা, এটি একটি UUID এর en.wikipedia.org/wiki/Universally_unique_identifier - তার ঠিক যে দুর্ভাগ্যবশত মাইক্রোসফট preferrred করেছে GUID।
ডেভিড.বারখুইজেন

5
আপনার জন্য এখানে একটি লাইনার রয়েছে:python -c 'import uuid; print(uuid.uuid4())'
Ctrl-C

উত্তর:


776

পাইথন 2.5 এবং তারপরে ইউইড মডিউলটি আরএফসির সাথে সঙ্গতিপূর্ণ ইউইউডি জেনারেশন সরবরাহ করে। বিশদটির জন্য মডিউল ডকস এবং আরএফসি দেখুন। [ উত্স ]

দস্তাবেজ:

উদাহরণ (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আমি যে মডিউলটি লিখেছি তা একবার দেখুন, কারণ এটি আপনাকে সংক্ষিপ্ত, পঠনযোগ্য ইউআইডিগুলি
Stavros Korokithakis

2
@ স্ট্যাভ্রোস করোকিঠাকিস: আপনি কি কোনও সুযোগে পাইথন ৩.x এর জন্য শর্টইউড মডিউল লিখেছেন?
জে প্যাটেল

2
@ জয়প্যাটেল কি পাইথন 3 এর জন্য শর্টইউড কাজ করে না? যদি তা না হয় তবে দয়া করে একটি বাগ ফাইল করুন।
স্টাভ্রোস করোকিঠাকিস

1
মধ্যে পার্থক্য কি uuid4().hexএবং str(uuid4())?
কেভিন

6
হ্যাঁ, আপনি উপরে দেখতে পারেন, str(uuid4())UUID একটি স্ট্রিং উপস্থাপনা ফেরৎ ড্যাশ সঙ্গে অন্তর্ভুক্ত, যখন uuid4().hexআয় "UUID 32-অক্ষর হেক্সাডেসিমেল স্ট্রিং হিসেবে"
stuartd

324

যদি আপনি পাইথন 2.5 বা তার বেশি ব্যবহার করেন তবে ইউউইড মডিউলটি পাইথন স্ট্যান্ডার্ড বিতরণের সাথে ইতিমধ্যে অন্তর্ভুক্ত রয়েছে।

উদা:

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

আমি জিইউইডিগুলি ডাটাবেস ধরণের ক্রিয়াকলাপের জন্য এলোমেলো কী হিসাবে ব্যবহার করি।

ড্যাশগুলি এবং অতিরিক্ত অক্ষরগুলির সাথে ষড়যন্ত্র ফর্মটি আমার কাছে অযথা দীর্ঘস্থায়ী মনে হয়। তবে আমি এটিও পছন্দ করি যে হেক্সাডেসিমাল সংখ্যার প্রতিনিধিত্বকারী স্ট্রিংগুলি খুব নিরাপদ কারণ এতে কিছু অক্ষর নেই যা কিছু পরিস্থিতিতে যেমন সমস্যা তৈরি করতে পারে যেমন '+', '=', ইত্যাদি ..

হেক্সাডেসিমালের পরিবর্তে, আমি একটি url- নিরাপদ বেস 64 স্ট্রিং ব্যবহার করি। নিম্নলিখিতটি কোনও ইউআইডি / জিইউডি সুনির্দিষ্টভাবে মেনে চলে না (প্রয়োজনীয় পরিমাণ এলোমেলো অবস্থা বাদে অন্যটি)।

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 বাইট ব্যবহার করুন (র্যান্ডম বনাম ইউআইউডিভি 4 এর 1-2 বিট হারাতে) এবং =3 টি বাইটের এনকোডের কোনও একাধিক হিসাবে এনকোডযুক্ত আকারটি 20 বাইটে (24 থেকে ছাঁটাই করা 22) কমিয়ে আনার সময় লক্ষণগুলি ছাঁটাতে হবে না avoid থেকে #bytes / 3 * 4কোনো প্যাডিং সঙ্গে করুন Base64- অক্ষর প্রয়োজন।
শ্যাডোর্যাঞ্জার

@ শ্যাডোএ্যাঞ্জার হ্যাঁ মূলত ধারণাটি স্থির করে। 128 এলোমেলো বিট, যথাসম্ভব স্বাচ্ছন্দ্য সহ্য করা সম্ভব, পাশাপাশি ইউআরএলও নিরাপদ। আদর্শভাবে এটি কেবল উচ্চ এবং নিম্নের অক্ষর এবং তারপরে সংখ্যাগুলি ব্যবহার করবে। সুতরাং আমি একটি বেস 62 স্ট্রিং অনুমান।
ক্রিস ডাট্রো

আমি যখন আপনার ফাংশনটি ব্যবহার করি তখন returnবাইটের মতো অবজেক্টের প্রত্যাশা করে বিবৃতি থেকে একধরণের ত্রুটি পাই । এটি দিয়ে স্থির করা যেতে পারে return str(r_uuid).replace('=','')
মার্ক কর্টিংক

8

যদি আপনার মডেল বা অনন্য ক্ষেত্রের জন্য প্রাথমিক কী জন্য আপনাকে ইউইউডি পাস করতে হয় তবে নীচের কোডটি ইউইউডি অবজেক্টটি প্রদান করে -

 import uuid
 uuid.uuid4()

আপনার যদি ইউআউডি ইউআরএইডিকে প্যারামিটার হিসাবে পাস করার দরকার হয় তবে আপনি নীচের কোডের মতো করতে পারেন -

import uuid
str(uuid.uuid4())

আপনি যদি কোনও ইউইউডিটির হেক্স মানটি চান তবে নীচেরটি করতে পারেন -

import uuid    
uuid.uuid4().hex

0

এই ফাংশনটি সম্পূর্ণরূপে কনফিগারযোগ্য এবং নির্দিষ্ট করা ফর্ম্যাটটির ভিত্তিতে অনন্য ইউআইডি উত্পন্ন করে

উদাহরণস্বরূপ: - [8, 4, 4, 4, 12], এটি উল্লিখিত ফর্ম্যাটটি এবং এটি নিম্নলিখিত ইউইড তৈরি করবে

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
ইউআইডিগুলি মানসম্পন্ন এবং দৈর্ঘ্যে পরিবর্তনশীল নয়। একটি কনফিগারযোগ্য উপায়ে এলোমেলো স্ট্রিং তৈরি করা কিছু পরিস্থিতিতে কার্যকর হতে পারে তবে এই প্রসঙ্গে নয়। সংজ্ঞার জন্য আপনি en.wikedia.org/wiki/Universally_unique_phanfier পরীক্ষা করতে পারেন ।
মাইগুয়েলার

2
এটিকে এড়িয়ে যাওয়া ভাল বা আপনি সামঞ্জস্যতার সমস্যাগুলিতে চলতে পারেন (এগুলি স্ট্যান্ডার্ড জিইউইউডি নয়)
সিলভাইন গ্যান্টোইস

-1

2019 উত্তর (উইন্ডোজ জন্য):

আপনি যদি স্থায়ী ইউআইডি চান যা কোনও উইন্ডোজটিতে কোনও মেশিনকে স্বতন্ত্রভাবে সনাক্ত করে, আপনি এই কৌশলটি ব্যবহার করতে পারেন: ( 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())

কম্পিউটারের স্থায়ী ইউআইডি পাওয়ার জন্য উইন্ডোজ এপিআই ব্যবহার করে, তারপরে এটি কার্যকর বৈধ ইউআইডি হওয়ার জন্য স্ট্রিংটি প্রক্রিয়া করে এবং শেষ পর্যন্ত একটি পাইথন অবজেক্ট ( https://docs.python.org/3/library/uuid.html ) দেয় যা আপনাকে সুবিধাজনক দেয় ডেটা ব্যবহারের উপায়গুলি (যেমন 128-বিট ইন্টিজার, হেক্স স্ট্রিং ইত্যাদি)।

শুভকামনা!

পিএস: সাব-প্রসেস কলটি সম্ভবত উইন্ডোজ কার্নেল / ডিএলএলকে সরাসরি কল করে সিটিপস দিয়ে প্রতিস্থাপন করা যেতে পারে। তবে আমার উদ্দেশ্যে এই ফাংশনটি আমার প্রয়োজন I এটি শক্তিশালী বৈধতা দেয় এবং সঠিক ফলাফল দেয়।


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

কারণ আমার বড় গিউডি এর পরিবর্তে মাত্র 4-6 টি এলোমেলো অক্ষর প্রয়োজন।


এটি সম্পূর্ণরূপে প্রশ্নের সাথে সম্পর্কিত নয়, যা ইউইউডিগুলি সম্পর্কিত।
মনিকা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.