如何从Python生成唯一的64位整数?

Con*_*ion 32 python random uuid guid uniqueidentifier

我需要从Python生成唯一的64位整数.我已经检查了UUID模块.但它生成的UUID是128位整数.所以那不行.

你知道在Python中生成64位唯一整数的方法吗?谢谢.

Joh*_*ooy 40

只需屏蔽128bit int

>>> import uuid
>>> uuid.uuid4().int & (1<<64)-1
9518405196747027403L
>>> uuid.uuid4().int & (1<<64)-1
12558137269921983654L
Run Code Online (Sandbox Code Playgroud)

这些或多或少是随机的,所以你碰撞的可能性很小

也许uuid1的前64位使用起来更安全

>>> uuid.uuid1().int>>64
9392468011745350111L
>>> uuid.uuid1().int>>64
9407757923520418271L
>>> uuid.uuid1().int>>64
9418928317413528031L
Run Code Online (Sandbox Code Playgroud)

这些主要基于时钟,随机性更低,但独特性更好

  • 右移64位会消除MAC地址和时间,只留下时钟. (4认同)
  • uuid1显示MAC地址和时间 - uuid4更安全. (3认同)

S.L*_*ott 23

64位唯一

计数有什么问题?一个简单的计数器将创建唯一的值.这是最简单的,很容易确保你不会重复一个值.

或者,如果计数不够好,试试这个.

>>> import random
>>> random.getrandbits(64)
5316191164430650570L
Run Code Online (Sandbox Code Playgroud)

根据种子和使用随机数生成器的方式,这应该是唯一的.

当然,您可以错误地执行此操作并获得重复的随机数序列.对于如何处理启动和停止程序的种子,必须非常小心.

  • 序列在理论上更长."它产生53位精度浮点数,周期为2**19937-1." 为什么getrandbits()没有完整的时期?它会产生多个数字吗?即使它生成64个不同的值并且仅使用一个位,结果周期也将是2 ^ 311. (2认同)

Gly*_*yph 7

来自OS的随机数生成器而不是PRNG的64位随机数:

>>> from struct import unpack; from os import urandom
>>> unpack("!Q", urandom(8))[0]
12494068718269657783L
Run Code Online (Sandbox Code Playgroud)