генерировать UUID типа long - PullRequest
6 голосов
/ 25 декабря 2010

Пожалуйста, дайте мне пример кода для генерации UUID типа long в Java без использования метки времени.

Спасибо

Ответы [ 3 ]

20 голосов
/ 25 декабря 2010

Реальный UUID составляет 128 бит.Длинный - 64 бита.

Это не просто педантизм.UUID означает Универсальный Уникальный идентификатор.

«Универсальная уникальность» установленных схем UUID основана на:

  • кодированииMAC-адрес и временная метка,
  • , кодирующая хэш DNS-имени и временной метки, или
  • , использующий 122-битное случайное число ... которое достаточно велико, чтобы вероятность столкновения составлялаочень очень маленький.

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

Теперь, если вам нужен только UID(не UUID), тогда любой 64-битный генератор последовательности выполнит эту работу, при условии, что вы предпримете меры для предотвращения повторения последовательности.(Если последовательность повторяется, то идентификаторы не являются уникальными во времени; т.е. с течением времени данный идентификатор может обозначать разные объекты.)

7 голосов
/ 25 декабря 2010

Вы смотрели на java.util.UUID ?

2 голосов
/ 25 декабря 2010

Если вам нужен простой уникальный long, вы можете использовать AtomicLong.incrementAndGet (). Он не использует метку времени, но сбрасывается до 0 при каждом его запуске и не является уникальным для всех JVM.

Что означает требование вообще не использовать временные метки? UUID использует метку времени. (среди прочего)

...