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

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

9 ответов


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

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


int uniqueId = 0;

int getUniqueId()
{
    return uniqueId++;
}

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


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

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

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

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

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

return (myID << 16) & uniqueID++

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

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



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


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

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

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


тебе нужно;

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

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