Как создать уникальный идентификатор в Java (целое число)? - PullRequest
21 голосов
/ 01 февраля 2010

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

Ответы [ 9 ]

53 голосов
/ 01 февраля 2010

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

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

8 голосов
/ 01 февраля 2010
int uniqueId = 0;

int getUniqueId()
{
    return uniqueId++;
}

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

4 голосов
/ 01 февраля 2010

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

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

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

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

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

return (myID << 16) & uniqueID++

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

Если у вас есть Long вместо Int, одним из распространенных приемов является получение идентификатора устройства (UUID) ETH0, который гарантированно уникален для сервера, а затем просто добавьте серийный номер. *

2 голосов
/ 01 февраля 2010

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

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

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

1 голос
/ 21 августа 2012
 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();
        }
    }

}

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

1 голос
/ 05 февраля 2010

Нужно ли вам быть;

  • уникально между двумя JVM, работающими на в то же время.
  • уникально, даже если JVM перезапущен
  • потокобезопасный.
  • поддержка null? если нет, используйте int или long.
1 голос
/ 01 февраля 2010
1 голос
/ 01 февраля 2010

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

0 голосов
/ 20 октября 2014

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

int uniqueId = (int) (System.currentTimeMillis() & 0xfffffff);
...