PythonでGUID / UUIDを作成する方法


685

Pythonでプラットフォームに依存しないGUIDを作成するにはどうすればよいですか?WindowsでActivePythonを使用する方法があると聞きましたが、COMを使用しているためWindowsのみです。プレーンなPythonを使用する方法はありますか?



34
神聖なすべての愛のために、それはUUID-Universal Unique ID en.wikipedia.org/wiki/Universally_unique_identifier-それはまさに残念なことに、MSがGUIDを好んだということです。
david.barkhuizen 2013年

5
ここではあなたのための1つのライナーがあります:python -c 'import uuid; print(uuid.uuid4())'
はCtrl-C

回答:


776

Python 2.5以降のuuidモジュールは、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私が書いたモジュールを見てください。これにより、短くて読み取り可能なUUIDを生成できるようになります。github.com
technologies

2
@StavrosKorokithakis:たまたまPython 3.xのshortuuidモジュールを書いたことがありますか?
ジェイ・パテル

2
@JayPatel shortuuidはPython 3では機能しませんか?そうでない場合は、バグを報告してください。
Stavros Korokithakis

1
違いは何だuuid4().hexとはstr(uuid4())
ケビン

6
さて、上記のようにstr(uuid4())、ダッシュを含むUUIDの文字列表現をuuid4().hex返しますが、「32文字の16進数文字列としてのUUID」
stuartd

324

Python 2.5以降を使用している場合、uuidモジュールはすでにPython標準ディストリビューションに含まれています。

例:

>>> 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を使用しています。

ダッシュと余分な文字を含む16進形式は、私にとって不必要に長いように見えます。ただし、16進数を表す文字列は、「+」、「=」などの状況で問題を引き起こす可能性のある文字が含まれていないため、非常に安全であることも気に入っています。

16進数ではなく、urlセーフなbase64文字列を使用します。ただし、以下は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
UUIDコンテキストでそれを使用するつもりがない場合は、random.getrandbits(128).to_bytes(16, 'little')または(暗号のランダム性のために)またはos.urandom(16)128ビットのランダムを使用することもできます(UUIDv4はバージョン情報で6〜7ビットを使用します)。または、15バイトのみを使用して(UUIDv4と比較して1〜2ビットのランダムを失う=)、3バイトの倍数がエンコードするので、符号化サイズを20バイト(24から22にトリミング)に削減しながら、符号を削除する必要を回避します。#bytes / 3 * 4不要パディングとbase64で文字。
ShadowRanger

@ShadowRangerそうだね、基本的にはそうだね。128のランダムなビット、可能な限り短く、同時にURLセーフです。理想的には、大文字と小文字、次に数字のみを使用します。だから私はbase-62文字列を推測します。
クリスDutrow

関数を使用するとreturn、バイトのようなオブジェクトを期待するステートメントから型エラーが発生します。で修正できますreturn str(r_uuid).replace('=','')
マークKortink

8

モデルまたは一意のフィールドの主キーにUUIDを渡す必要がある場合、以下のコードはUUIDオブジェクトを返します-

 import uuid
 uuid.uuid4()

あなたがURLのパラメータとしてUUIDを渡す必要がある場合は、以下のコードのようにすることができます-

import uuid
str(uuid.uuid4())

UUIDの16進数値が必要な場合は、以下の1つを実行できます-

import uuid    
uuid.uuid4().hex

0

この関数は完全に設定可能であり、指定された形式に基づいて一意のuidを生成します

例:-[8、4、4、4、12]、これは前述の形式であり、次の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

3
UUIDは標準であり、長さが可変ではありません。構成可能な方法でランダムな文字列を生成することは、状況によっては役立つ場合がありますが、このコンテキストでは役立ちません。定義については、en.wikipedia.org / wiki / Universally_unique_identifierを確認してください。
miguelr

2
これを回避するか、互換性の問題が発生する可能性があります(これらは標準のGUIDではありません)
Sylvain Gantois

-1

2019回答(Windows用):

Windowsでマシンを一意に識別する永続的なUUIDが必要な場合は、このトリックを使用できます(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())

Windows APIを使用してコンピューターの永続的なUUIDを取得し、文字列を処理して有効なUUIDであることを確認し、最後にPythonオブジェクト(https://docs.python.org/3/library/uuid.html)を返します。データの使用方法(128ビット整数、16進文字列など)。

幸運を!

PS:サブプロセスの呼び出しは、おそらくWindowsカーネル/ DLLを直接呼び出す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個のランダムな文字が必要だったからです。


これは、UUIDに関する質問とはまったく無関係のようです。
モニカとソックス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.