Pythonから一意の64ビット整数を生成する必要があります。 IDモジュール をチェックアウトしました。ただし、生成されるUUIDは128ビットの整数です。だからそれはうまくいきません。
Python内で64ビットの一意の整数を生成する方法を知っていますか?ありがとう。
128ビット整数をマスクするだけです
>>> import uuid
>>> uuid.uuid4().int & (1<<64)-1
9518405196747027403L
>>> uuid.uuid4().int & (1<<64)-1
12558137269921983654L
これらは多かれ少なかれランダムなので、衝突する可能性はわずかです
おそらく、uuid1の最初の64ビットを使用する方が安全です。
>>> uuid.uuid1().int>>64
9392468011745350111L
>>> uuid.uuid1().int>>64
9407757923520418271L
>>> uuid.uuid1().int>>64
9418928317413528031L
これらは主にクロックに基づいているため、ランダム性ははるかに低くなりますが、一意性は優れています
64ビット固有
カウントの何が問題になっていますか?単純なカウンターは一意の値を作成します。これは最も単純で、値を繰り返さないようにするのは簡単です。
または、カウントが十分でない場合は、これを試してください。
>>> import random
>>> random.getrandbits(64)
5316191164430650570L
乱数ジェネレーターのシード方法と使用方法に応じて、一意にする必要があります。
もちろん、これを誤って行うと、乱数の繰り返しシーケンスを取得できます。開始および停止するプログラムのシードの処理方法には、十分な注意が必要です。
PRNGではなく、OSの乱数ジェネレーターからの64ビットの乱数:
>>> from struct import unpack; from os import urandom
>>> unpack("!Q", urandom(8))[0]
12494068718269657783L
単一のランダムな128ビット整数UUIDを生成するuuid4()
を使用できます。 64ビットで生成された各128ビット整数(128 - (128 - 64)
)を「バイナリ右シフト」(>>
)する必要があります。
from uuid import uuid4
bit_size = 64
sized_unique_id = uuid4().int >> bit_size
print(sized_unique_id)