50 votes

Comment générer des entiers 64 bits uniques à partir de Python ?

Je dois générer des entiers 64 bits uniques à partir de Python. J'ai vérifié le module UUID. Mais l'UUID qu'il génère sont des entiers de 128 bits. Donc ça ne marcherait pas.

Connaissez-vous un moyen de générer des entiers uniques de 64 bits dans Python ? Merci.

71voto

gnibbler Points 103484

masquez simplement les 128 bits int

>>> import uuid
>>> uuid.uuid4().int & (1<<64)-1
9518405196747027403L
>>> uuid.uuid4().int & (1<<64)-1
12558137269921983654L

Ceux-ci sont plus ou moins aléatoires, de sorte que vous avez une petite chance d'une collision

Peut-être que les 64 premiers bits d'uuid1 sont plus sûrs à utiliser

>>> uuid.uuid1().int>>64
9392468011745350111L
>>> uuid.uuid1().int>>64
9407757923520418271L
>>> uuid.uuid1().int>>64
9418928317413528031L

Ceux-ci sont en grande partie basés sur l'horloge, beaucoup moins au hasard, mais l'unicité est meilleure

9voto

Glyph Points 17756

Un nombre aléatoire 64 bits du générateur de nombres aléatoires de l'OS plutôt qu'un PRNG :

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

2voto

Chuma Umenze Points 85

Vous pouvez utiliser uuid4() qui génère un seul UUID entier aléatoire de 128 bits. Nous devons « décaler vers la droite binaire » (>>) chaque entier de 128 bits généré par 64 bits (c'est-à-dire 128 - (128 - 64)).

from uuid import uuid4

bit_size = 64
sized_unique_id = uuid4().int >> bit_size
print(sized_unique_id)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X