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.
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
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.
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
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)