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

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

11 ответов

Решение

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

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

int uniqueId = 0;

int getUniqueId()
{
    return uniqueId++;
}

добавлять synchronized если вы хотите, чтобы это было поточно-ориентированным.

 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();
        }
    }

}

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

Это легко, если вы несколько стеснены.

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

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

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

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

return (myID << 16) & uniqueID++

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

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

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

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

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

Вам нужно это быть;

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

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

если требуется только int, то AtomicInteger может сделать это возможным.

если требуется String, то приведенный ниже код должен работать, смешивая timeStamp и AtomicLong.

      AtomicLong idCounter =  new AtomicLong(100);
long timestamp = System.currentTimeMillis();
long nextLong = idCounter.incrementAndGet();
String randomId = String.valueOf(timestamp)+String.valueOf(nextLong); 

Представьте, что у вас есть класс employee со следующими атрибутами:

      public class Employee {
    
    private final String name;
    private int id;
    private static int nextID = 1;
    
    public Employee(String name) {
        this.name= name;
        id = nextID++;
    }
}

Очень просто

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

int uniqueId = (int) (System.currentTimeMillis() & 0xfffffff);
Другие вопросы по тегам