Подтвердить что ты не робот

UUID для уникального целочисленного идентификатора?

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

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

4b9b3361

Ответ 1

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

Ответ 2

Ответ на вопрос Как можно получить уникальное приложение Integer:

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

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

EDIT (добавлен пример):

public class Sequence {

  private static final AtomicInteger counter = new AtomicInteger();

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

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

int nextValue = Sequence.nextValue();

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

Ответ 3

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

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

Ответ 4

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

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

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

Ответ 5

Если вы имеете в виду под int тот, который принимает 4 байта, то вы не можете сделать это, как объяснено в других ответах, причина принцип голубиной дыры. Но если вы просто хотите, чтобы он вел себя как целое число, вы можете передать его в конструктор BigInteger и использовать его как номер.

Ответ 6

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

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

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

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

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