Necesito generar único de 64 bits enteros de Python. He comprobado las UUID módulo. Pero el UUID que genera son de 128 bits enteros. Así que no iba a funcionar.

¿Sabe usted de alguna manera a generar 64 bits enteros únicos dentro de Python? Gracias.

  • Cómo única necesitan ser? único para ese programa, o único para cada ID generado por cualquier programa en cualquier ordenador (que es lo UUID da)?
  • Dave – estos son documento de IDENTIFICACIÓN. Cada ID generado debe ser único. Yo podría haber varios servidores, cada uno tiene Python procesos.
  • ¿Por qué no simplemente asignar números secuenciales? Son únicos.
  • ¿Cómo se coordinan los diferentes Python procesos en máquinas diferentes para asignar números secuenciales?
  • (1) ¿por Qué importa eso? Es un requisito? Si es un requisito, entonces ¿por qué no este requisito en la pregunta? (2) Que es lo servidores de base de datos para.
InformationsquelleAutor Continuation | 2010-08-20

4 Comentarios

  1. 39

    sólo la máscara de la 128 bits int

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

    Estos son más o menos aleatorio, por lo que tienen una pequeña probabilidad de una colisión

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

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

    Estos son en gran parte basado en el reloj, así que mucho menos al azar, pero la singularidad es la mejor

    • uuid1 revela la dirección MAC y el tiempo de uuid4 es más seguro.
    • Derecho de cambio de 64 bits elimina la dirección MAC y el tiempo, dejando sólo el reloj.
    • El uuid1 será más probable que sea único, precisamente por esa razón. Depende de si la seguridad es necesaria o no, pero la desventaja es que para uuid4, colisiones, será más probable
    • la parte con uuid1 es incorrecta o engañosa, porque crea enteros sin signo, no enteros (un entero debe ser firmado por defecto). Creo que la manera correcta es algo como esto: int.from_bytes(uuid.uuid1().bytes, byteorder=’grande’, firmada=True) >> 64
    • si usted cree que stanProkop mejora su respuesta estaría dispuesto a actualizarlo? Mi conjetura es que es mejorado por el bit extra.
  2. 23

    De 64 bits único

    ¿Qué tiene de malo contar? Un simple contador crear valores únicos. Este es el más simple y es fácil estar seguro de que usted no repetir un valor.

    O, si el recuento no es suficiente, prueba este.

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

    Dependiendo de cómo la semilla y el uso de su generador de números aleatorios, que debe ser único.

    Usted puede, por supuesto, hacer esto de forma incorrecta y obtener la repetición de una secuencia de números aleatorios. Gran cuidado debe ser tomado con la forma de manejar las semillas para un programa que se inicia y se detiene.

    • No importa lo bueno que sus semillas son que es probable que se repite después de aproximadamente 2^32 IDs se han generado si utiliza el getrandbits() método.
    • La secuencia es teóricamente más. «Se produce de 53 bits de precisión carrozas y tiene un período de 2**19937-1.» ¿Por qué getrandbits() no tener la totalidad del período? ¿Genera múltiples números? Incluso si se genera 64 valores distintos y sólo usa un bit, el período sería 2^311.
    • Cómo de grande es la semilla? Si utiliza la misma semilla que usted podría obtener los mismos números aleatorios
  3. 7

    De 64 bits del número al azar desde el sistema operativo del generador de números aleatorios en lugar de un PRNG:

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

    Puede utilizar uuid4() que genera una sola aleatoria de 128 bits entero UUID. Tenemos a ‘binario derecha shift’ (>>) cada uno de los 128 bits enteros generados por la de 64 bits (es decir,128 - (128 - 64)).

    from uuid import uuid4
    
    bit_size = 64
    sized_unique_id = uuid4().int >> bit_size
    print(sized_unique_id)
    • Usted sería mejor que simplemente generar los bytes directamente con, por ejemplo,os.urandom(8), o secrets.randbelow(2**64). Para una cosa, sólo 122 de la 128 bits de un uuid4 son generados al azar; los otros 6 son fijos. Su método sólo le da 60 de bits aleatorios, no 64, lo que aumenta la probabilidad de una colisión aleatoria.

Dejar respuesta

Please enter your comment!
Please enter your name here