Pythonでプラットフォームに依存しないGUIDを作成するにはどうすればよいですか?WindowsでActivePythonを使用する方法があると聞きましたが、COMを使用しているためWindowsのみです。プレーンなPythonを使用する方法はありますか?
python -c 'import uuid; print(uuid.uuid4())'
Pythonでプラットフォームに依存しないGUIDを作成するにはどうすればよいですか?WindowsでActivePythonを使用する方法があると聞きましたが、COMを使用しているためWindowsのみです。プレーンなPythonを使用する方法はありますか?
python -c 'import uuid; print(uuid.uuid4())'
回答:
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'
shortuuid
私が書いたモジュールを見てください。これにより、短くて読み取り可能なUUIDを生成できるようになります。github.com
uuid4().hex
とはstr(uuid4())
?
str(uuid4())
、ダッシュを含むUUIDの文字列表現をuuid4().hex
返しますが、「32文字の16進数文字列としてのUUID」
コピー元: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')
データベースタイプの操作のランダムキーとして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('=', '')
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で文字。
return
、バイトのようなオブジェクトを期待するステートメントから型エラーが発生します。で修正できますreturn str(r_uuid).replace('=','')
。
この関数は完全に設定可能であり、指定された形式に基づいて一意の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
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に置き換えることができます。しかし、私の目的では、この機能で十分です。強力な検証を行い、正しい結果を生成します。
この投稿を確認してください。要するに、私にとって最良のオプションは次のとおりです。
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個のランダムな文字が必要だったからです。