2010-08-20 17 views
17

Necesito generar enteros únicos de 64 bits de Python. He comprobado el UUID module. Pero el UUID que genera son enteros de 128 bits. Entonces eso no funcionaría.Cómo generar enteros únicos de 64 bits de Python?

¿Conoces alguna forma de generar enteros únicos de 64 bits dentro de Python? Gracias.

+1

Cómo único es lo que necesitan para ser? exclusivo para ese programa, o único para cada ID que haya generado cualquier programa en cualquier computadora (¿qué es lo que UUID le ofrece)? –

+0

Dave: estos son documentos ID. Cada identificación que se genera debe ser única. Podría tener varios servidores, cada uno tiene procesos de Python. – Continuation

+0

¿Por qué no simplemente asignar números secuenciales? Ellos son únicos. –

Respuesta

30

simplemente enmascaran el int 128 bits

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

Estos son más o menos al azar, por lo que tiene una pequeña posibilidad de una colisión

Tal vez los primeros 64 bits de uuid1 es más seguro utilizar

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

Estos se basan principalmente en el reloj, tanto menos aleatorio, pero la singularidad es mejor

+2

uuid1 revela la dirección MAC y la hora - uuid4 es más seguro. –

+3

El desplazamiento a la derecha en 64 bits elimina la dirección MAC y la hora, dejando solo el reloj. – Glyph

+0

@LukasCenovsky, es más probable que el uuid1 sea único precisamente por ese motivo. Depende de si se requiere seguridad o no, pero la compensación es que para uuid4, las colisiones serán más probables –

14

64 bits de únicos

lo que está mal con el conteo? Un contador simple creará valores únicos. Este es el más simple y es fácil estar seguro de que no repetirás un valor.

O, si el conteo no es lo suficientemente bueno, intente esto.

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

Dependiendo de cómo se inicialice y use su generador de números aleatorios, eso debe ser único.

Puede, por supuesto, hacerlo incorrectamente y obtener una secuencia repetitiva de números aleatorios. Se debe tener mucho cuidado con la forma de manejar las semillas para un programa que comienza y se detiene.

+0

No importa qué tan buenas sean sus semillas, es probable que obtenga repeticiones después de que se hayan generado aproximadamente 2^32 ID si usa los getrandbits() método. –

+1

La secuencia es teóricamente más larga. "Produce flotadores de precisión de 53 bits y tiene un período de 2 ** 19937-1". ¿Por qué getrandbits() no tiene el período completo? ¿Genera múltiples números? Incluso si genera 64 valores distintos y usa solo un bit, el período resultante sería 2^311. –

+0

¿Qué tan grande es la semilla? Si usa la misma semilla, obtendría los mismos números aleatorios – dalore

5

Un número aleatorio de 64 bits del generador de números aleatorios del sistema operativo en lugar de un PRNG:

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