UUID для уникального целочисленного идентификатора? - PullRequest
45 голосов
/ 06 апреля 2011

Мне было интересно, каким будет самый простой способ преобразования UUID в уникальное целое число?Я пытался использовать хеш-код, но люди говорят мне, что он не всегда будет уникальным, если я использую хеш-код?

Так какой самый простой способ?Является ли хеш-код уникальным?

Ответы [ 5 ]

32 голосов
/ 06 апреля 2011

У вас возникнет проблема, поскольку UUID составляет 128 бит, а int - только 32 бита.Вам либо придется принять риск столкновений и попытаться выдвинуть его на меньшее место (hashCode, вероятно, хороший способ сделать это), либо найти альтернативу (использовать UUID напрямую, отобразить на BigInteger - трудно сказать, не зная почему)

11 голосов
/ 06 апреля 2011

Отвечая на вопрос Как я могу иметь уникальное целое приложение широкого диапазона:

Если оно должно быть уникальным даже после перезапуска или если ваше приложение кластеризовано, вы можете использовать последовательность базы данных.

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

РЕДАКТИРОВАТЬ (пример добавлен):

public class Sequence {

  private static final AtomicInteger counter = new AtomicInteger();

  public static int nextValue() {
    return counter.getAndIncrement();
  }
}

Использование:

int nextValue = Sequence.nextValue();

Это потокобезопасный (разные потоки всегда будут получать разные значения, и никакие значения не будут "потеряны")

3 голосов
/ 06 апреля 2011

Нет, хеш-код не является (и не может быть) уникальным. Особенность GUID / UUID состоит в том, что вам нужны все 128 битов, чтобы гарантировать уникальность, поэтому их уменьшение в любом случае вызовет проблемы, см., Например, GUID глобально уникальны, но подстроки GUID не .

Честно говоря, я думаю, вам лучше просто использовать последовательные целые числа и вообще пропустить GUID. Если по какой-либо причине вам нужны GUID, используйте их и не пытайтесь генерировать из них целое число.

1 голос
/ 28 декабря 2018

У нас было требование преобразовать все наши UUID в серийные номера. Наконец, мы протестировали и использовали следующий алгоритм:

  1. Получить CRC64 из uuid (16 байт) с использованием полинома ECMA 0xC96C5795D7870F42. Не используйте полином ISO, потому что это может привести к много коллизий для некоторых алгоритмов генерации UUID.

  2. Теперь у нас есть crc64 (8 байт). Возьмите первые N байтов (в нашем случае 5 у вас будет 4 байта для int и все байты для int64)

Мы протестировали этот метод, и он хорошо работает для нескольких миллионов UUID.

Наш дополнительный шаг: преобразовать 5-байтовое число в число с основанием 36 и, наконец, получим SN: 4YD3SOJB.

1 голос
/ 06 апреля 2011

UUID - это 16-байтовое число (128 бит).Вы не можете превратить его в int (32 бита), сохранив его уникальность.

Говорят математически: 2 96 UUID будут использовать одно и то же значение хеша Java- int -размера (что ... много;))

Способout - некоторые UUID в реальной жизни часто имеют довольно статичную часть.Таким образом, в изолированных сценариях действительная уникальная часть UUID может быть меньше 32 бит.

...