我需要从Python生成唯一的64位整数。我已经查看了UUID模块,但是它生成的UUID为128位整数,因此不能使用。
您知道在Python中生成64位唯一整数的任何方法吗?谢谢。
我需要从Python生成唯一的64位整数。我已经查看了UUID模块,但是它生成的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
根据您如何生成和使用随机数生成器,它应该是唯一的。
当然,您可能会不正确地执行此操作并获得重复的随机数序列。在处理程序的种子以启动和停止程序时需要非常小心。
使用操作系统的随机数生成器生成一个64位的随机数,而不是伪随机数生成器:
>>> from struct import unpack; from os import urandom
>>> unpack("!Q", urandom(8))[0]
12494068718269657783L
uuid4()
生成一个随机的128位整数UUID。我们需要对每个128位整数进行“二进制右移”操作(>>
),使其变为64位(即128 - (128 - 64)
)。from uuid import uuid4
bit_size = 64
sized_unique_id = uuid4().int >> bit_size
print(sized_unique_id)
os.urandom(8)
或secrets.randbelow(2**64)
来直接生成字节。首先,uuid4的128位中仅有122位是随机生成的,而另外6位是固定的。你的方法只提供了60个随机位而不是64个,这会增加随机碰撞的可能性。 - Mark Dickinsonimport uuid
id = uuid.uuid1()
# Representations of uuid1()
print (repr(id.bytes)) # k\x10\xa1n\x02\xe7\x11\xe8\xaeY\x00\x16>\x99\x0b\xdb
print (id.int) # 142313746482664936587190810281013480411
print (id.hex) # 6b10a16e02e711e8ae5900163e990bdb