Как генерировать уникальные 64-битные целые числа из Python? - PullRequest
28 голосов
/ 20 августа 2010

Мне нужно сгенерировать уникальные 64-битные целые числа из Python.Я проверил UUID модуль .Но UUID, который он генерирует - это 128-битные целые числа.Так что это не сработает.

Вы знаете какой-нибудь способ генерирования 64-битных уникальных целых чисел в Python?Спасибо.

Ответы [ 4 ]

39 голосов
/ 20 августа 2010

просто замаскируйте 128-битное int

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

Они более или менее случайны, поэтому у вас есть небольшая вероятность столкновения

Возможно, первые 64 бита uuid1 безопаснее использовать

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

Они в основном основаны на часах, гораздо менее случайны, но уникальность лучше

21 голосов
/ 20 августа 2010

64 бита, уникальный

Что не так со счетом? Простой счетчик создаст уникальные значения. Это самое простое, и легко быть уверенным, что вы не будете повторять значение.

Или, если счет не достаточно хорош, попробуйте это.

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

В зависимости от того, как вы сеете и используете генератор случайных чисел, он должен быть уникальным.

Вы можете - конечно - сделать это неправильно и получить повторяющуюся последовательность случайных чисел. Необходимо внимательно следить за тем, как вы обрабатываете семена, для программы, которая запускается и останавливается.

7 голосов
/ 01 июня 2012

64-битное случайное число из генератора случайных чисел ОС, а не PRNG:

>>> from struct import unpack; from os import urandom
>>> unpack("!Q", urandom(8))[0]
12494068718269657783L
1 голос
/ 07 ноября 2018

Вы можете использовать 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)
...