Как генерировать уникальный идентификатор в Java (целое число)?

StackOverflow https://stackoverflow.com/questions/2178992

  •  24-09-2019
  •  | 
  •  

Вопрос

Как генерировать уникальный идентификатор, который является целым числом в Java, который не угадывает следующий номер?

Это было полезно?

Решение

Насколько уникально это должно быть?

Если это только уникально в процессе, вы можете использовать AtomicInteger и позвонить incrementAndGet() Каждый раз, когда вам нужно новое значение.

Другие советы

int uniqueId = 0;

int getUniqueId()
{
    return uniqueId++;
}

Добавлять synchronized Если вы хотите, чтобы он был безопасен в потоке.

Легко, если вы несколько ограничены.

Если у вас есть один поток, вы просто используете UniqueId ++; Обязательно сохраните текущий UniqueId, когда вы выходите.

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

Проблема в том, что у вас есть много процессоров - либо в кластере, либо в некоторой распределенной установке, как одноранговая игра.

В этом случае вы обычно можете сочетать две части, чтобы сформировать одно число. Например, каждый процесс, который генерирует уникальный идентификатор, может иметь свой собственный 2-байтовый идентификационный номер, назначенный, а затем объединить его с помощью UniqueId ++. Что-то типа:

return (myID << 16) & uniqueID++

Это может быть сложно распределить часть «минимального» части, но есть несколько способов. Вы можете просто схватить один из централизованной базы данных, запросите уникальный идентификатор с централизованного сервера, ...

Если у вас было длинное вместо INT, один из общих трюков - взять идентификатор устройства (UUID) eth0, это гарантированно будет уникальным для сервера - тогда просто добавьте на серийный номер.

Если вы действительно имели в виду целое число, а не INT:

Integer id = new Integer(42); // will not == any other Integer

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

Просто генерируйте ID и проверьте, уже присутствует ли он или нет в вашем списке сгенерированных идентификаторов.

Вам нужно, чтобы это было;

  • Уникальный между двумя JVMS работает одновременно.
  • Уникальный даже если JVM перезапущен.
  • Безопасен в потоке.
  • Поддержка NULL? Если нет, используйте int или долго.
 import java.util.UUID;

 public class IdGenerator {
    public static int generateUniqueId() {      
        UUID idOne = UUID.randomUUID();
        String str=""+idOne;        
        int uid=str.hashCode();
        String filterStr=""+uid;
        str=filterStr.replaceAll("-", "");
        return Integer.parseInt(str);
    }

    // XXX: replace with java.util.UUID

    public static void main(String[] args) {
        for (int i = 0; i < 5; i++) {
            System.out.println(generateUniqueId());
            //generateUniqueId();
        }
    }

}

Надеюсь, это поможет вам.

Уникальный в любое время:

int uniqueId = (int) (System.currentTimeMillis() & 0xfffffff);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top