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

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

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

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

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

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

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

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

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

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

Спасибо!

Ответы [ 4 ]

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

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

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

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

В зависимости от того, насколько уникальным он вам нужен, вы можете сгенерировать свою собственную форму UUID, которая имеет более ширину машины уникальный идентификатор, а не универсально уникальный ID (т. Е. Он не может быть уникальным на разных компьютерах, но на одном компьютере все в порядке).

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

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

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

Кстати, "L" символизирует длинное целое, которое обычно означает 64-битную длину, а не 32-битную. Он просто добавляется, когда вы печатаете номер.

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

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

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

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

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

...