Как создать уникальный идентификатор в 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();
}
}
}
надеюсь, это поможет вам.