Как создать уникальный длинный с помощью UUID

У меня есть требование генерировать уникальные длинные идентификаторы для столбца первичного ключа базы данных.

Я думал, что могу использовать UUID.randomUUID(). getMostSignificantBits(), но иногда он генерирует некоторый отрицательный длинный и который является проблемой для меня.

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

Ответы

Ответ 1

Взгляните на http://commons.apache.org/sandbox/commons-id//index.html Он имеет LongGenerator, который может дать вам именно то, что вам нужно.

Кроме того, если вы используете Hibernate, вы можете попросить его создать идентификаторы для вас (у вас есть несколько алгоритмов, которые вы можете выбрать), если вы не можете просто взглянуть на их реализацию, например http://grepcode.com/file/repo1.maven.org/maven2/hibernate/hibernate/2.1.8/net/sf/hibernate/id/TableHiLoGenerator.java#TableHiLoGenerator)

Ответ 2

UUID.randomUUID().getMostSignificantBits() & Long.MAX_VALUE

Ответ 3

Как писали другие, долго не хватает места для уникального номера. Но во многих случаях число может быть достаточно уникальным для конкретного использования. Например, временная метка с точностью до наносекунд часто бывает достаточно хорошей. Чтобы получить его, сдвиньте текущие миллисекунды на 20 бит, чтобы выделить пространство для наносекунд, а затем наложите его на наносекунды:

(System.currentTimeMillis() << 20) | (System.nanoTime() & ~9223372036854251520L);

Часть nano и ~ 9223372036854251520L принимает текущие наносекунды и устанавливает первые 44 байта в 0, оставляя только правильные 20 бит, которые представляют наносекунды до одной миллисекунды (999999 нано) Это то же самое, что:

nanoseconds & ~1111111111111111111111111111111111111111111100000000000000000000

Боковое примечание: наносекунды не должны использоваться для представления текущего времени, потому что их исходная точка не фиксируется во времени и потому что они перерабатываются, когда они достигают максимума.

Вы можете использовать любые другие манипуляции с битами. Обычно полезно учитывать текущее время и что-то еще, например текущий идентификатор потока, идентификатор процесса, ip.

Ответ 4

Я только наткнулся на это решение. Я в настоящее время пытаюсь понять решение. Он говорит, что Java-реализация twitter-снежинки. 64-битный последовательный генератор ID, основанный на алгоритме генерации идентификатора снежинки.

https://github.com/Predictor/javasnowflake

Любые предложения приветствуются.