Как создать UUID типа long (для использования Java-программой) в Python?

1

Как вы генерируете UUID типа long (64 бит - для использования программой java) с использованием Python?

Я читал о модуле UUID . Поэтому я немного поиграл с ним:

>>> import uuid
>>> uuid.uuid1().int
315596929882403038588122750660996915734L

Почему существует " L" в конце целого числа, сгенерированного с помощью uuid.uuid1(). int? Если это целое число не должно состоять из чистых чисел?

Также в соответствии с документацией uuid.uuid1(). int будет генерировать 128-битное целое число. Мне нужно целое число длинное (для java-программы), что означало бы, что оно должно быть 64 бита. Возможно ли сгенерировать UUID из 64 бит вместо 128 бит?

Другая проблема заключается в том, что в соответствии с Python doc Python int составляет 32 бита, а Python long имеет "неограниченную точность". Что означает "неограниченная точность"? Мне нужен 64-битный длинный int - какой тип Python будет?

EDIT: Спасибо за ответы. Похоже, UUID по определению 128 бит. В этом случае я, вероятно, не должен использовать термин UUID. Я хочу сделать, чтобы создать уникальный идентификатор типа long (64 бит). Я думал, что UUID выполнит эту работу, но похоже, что это невозможно.

Мне нужен этот идентификатор в качестве идентификатора документа для поисковой системы Solr. Я использую плагин Solr для индексирования в реальном времени Zoie. И согласно документации, "Zoie предполагает, что каждая зарегистрированная запись должна иметь уникальный ключ и тип длинный."

Итак, учитывая, что мне нужно, знаете ли вы, что я могу сделать, чтобы генерировать уникальный идентификатор типа long?

Спасибо!

  • 0
    «Неограниченная точность» означает, что это похоже на BigInteger в Java. Тип данных не имеет фиксированной длины, но он может увеличиваться, чтобы вместить целые числа, которые вы хотите (до тех пор, пока не закончится память).
  • 0
    Чтобы добавить к комментарию Тило «неограниченную точность», более распространенное название - « Арифметика с произвольной точностью» . В Python 3.x обычные ints действуют также, а не только в longs .
Показать ещё 1 комментарий
Теги:
guid
uuid
long-integer

4 ответа

3
Лучший ответ

В зависимости от того, насколько вам это необходимо, вы можете создать свою собственную форму UUID, которая является скорее уникальным идентификатором машины, а не универсальным уникальным идентификатором. например нужно ли быть уникальным на разных компьютерах? или просто находится на одном компьютере в порядке?

Если только уникальная на одной платформе, вы можете уйти с удалением раздела id node в конце. то есть последние 6 байтов.

Кроме того, вам может понравиться, как часто генерируются эти числа. раз в секунду макс? или очень часто?

Посмотрите здесь, как генерируется UUID, и вы увидите, что я имею в виду. http://tools.ietf.org/id/draft-leach-uuids-guids-01.txt

Вероятно, вы можете свернуть свою версию для своей ситуации и все же выполнить свое требование и легко вписаться в 64 бит.

Кстати, L символизирует длинный int, который обычно означает длину 64 бит, а не 32 по умолчанию на большинстве машин. Это то, что происходит, когда вы печатаете число, но внутри оно не имеет значения L в нем.

  • 2
    Для пояснения, в Python sys.maxint L не означает 64-битный, это просто означает, что он больше, чем sys.maxint (который зависит от машины). В Python int - это размер sys.maxint (обычно 32-битный или 64-битный в зависимости от вашей машины), а long - это «неограниченный» размер (пока у вас не закончится память :))
  • 0
    Спасибо за разъяснения @TM. Я забыл, что существует множество платформ (например, телефонов), которые не являются 64-битными.
7

L означает, что это длинное целочисленное значение (больше 32 бит).

Стандартные UUID всегда 128 бит; если вы хотите что-то, что только 64 бит, вам нужно либо использовать только часть UUID, либо использовать что-то другое, кроме UUID.

  • 0
    +1 для UUID всегда 128 бит.
  • 0
    Почему так много голосов, когда он на самом деле не полностью ответил на его вопрос? Вы признаете себя, что "стандартные - 128 бит" ... как насчет нестандартных?
Показать ещё 4 комментария
1

Одна точка для добавления, даже Java UUID имеет длину 128 бит. Если вы собираетесь использовать его на Java, вы должны сделать его 128-битным, а не 64. http://download-llnw.oracle.com/javase/1.5.0/docs/api/java/util/UUID.html

1

Определение запаса UUID составляет 128 бит.

Я бы сказал, что 64 бит недостаточно для обеспечения несинхронизированной уникальности.

  • 0
    +1 за второе предложение.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню