web-dev-qa-db-ja.com

Pythonから一意の64ビット整数を生成する方法は?

Pythonから一意の64ビット整数を生成する必要があります。 IDモジュール をチェックアウトしました。ただし、生成されるUUIDは128ビットの整数です。だからそれはうまくいきません。

Python内で64ビットの一意の整数を生成する方法を知っていますか?ありがとう。

33
Continuation

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

これらは主にクロックに基づいているため、ランダム性ははるかに低くなりますが、一意性は優れています

39
John La Rooy

64ビット固有

カウントの何が問題になっていますか?単純なカウンターは一意の値を作成します。これは最も単純で、値を繰り返さないようにするのは簡単です。

または、カウントが十分でない場合は、これを試してください。

>>> import random
>>> random.getrandbits(64)
5316191164430650570L

乱数ジェネレーターのシード方法と使用方法に応じて、一意にする必要があります。

もちろん、これを誤って行うと、乱数の繰り返しシーケンスを取得できます。開始および停止するプログラムのシードの処理方法には、十分な注意が必要です。

22
S.Lott

PRNGではなく、OSの乱数ジェネレーターからの64ビットの乱数:

>>> from struct import unpack; from os import urandom
>>> unpack("!Q", urandom(8))[0]
12494068718269657783L
7
Glyph

単一のランダムな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)
1
Chuma Umenze