web-dev-qa-db-fra.com

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

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

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

26
Continuation

il suffit de masquer le 128bit int

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

Ce sont plus ou moins aléatoires, de sorte que vous avez une chance minime d'une collision

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

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

Celles-ci sont en grande partie basées sur l'horloge, tellement moins aléatoires mais l'unicité est meilleure

37
John La Rooy

64 bits unique

Quel est le problème avec le comptage? Un simple compteur créera des valeurs uniques. C'est le plus simple et il est facile d'être sûr de ne pas répéter une valeur.

Ou, si compter ne suffit pas, essayez ceci.

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

Selon la manière dont vous semez et utilisez votre générateur de nombres aléatoires, cela devrait être unique.

Bien entendu, vous pouvez le faire incorrectement et obtenir une suite répétitive de nombres aléatoires. Vous devez faire très attention à la manière dont vous gérez les semences d’un programme qui commence et s’arrête.

20
S.Lott

Un nombre aléatoire de 64 bits provenant du générateur de nombres aléatoires du système d'exploitation plutôt que d'un PRNG:

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

Vous pouvez utiliser uuid4() qui génère un seul UUID aléatoire de 128 bits. Nous devons «décaler à 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)
0
Chuma Umenze