Мне нужно создать уникальный номер в Java (для моей машины, на которой работает код), так что в C++ он может соответствовать uint32_t
. В общем, другая программа на C++ должна иметь возможность правильно прочитать этот уникальный номер как uint32_t
. Я отправляю эту информацию в массив байтов, который другая программа на С ++ десериализует его, чтобы получить это число. Я не могу изменить тип данных для этого числа в программе на C++.Как получить уникальное значение в Java, которое соответствует uint32_t?
private static final AtomicInteger clientId = new AtomicInteger(0);
// will be called many time when the program is running after initialization
public static int getClientId() {
int counter = clientId.incrementAndGet();
return counter == Integer.MAX_VALUE ? 0 : counter;
}
// called only once at startup
public static void setClientId(final int counter) {
clientId.addAndGet(counter == Integer.MAX_VALUE ? 0 : counter);
}
Так что я придумал код выше. Мой метод setClientId
будет вызываться только один раз во время запуска приложения (фазы инициализации):
- Если эта машина работает код в первый раз, как это новая машина, то я передам
0
кsetClientId
метод. - Если эта машина уже запускала код, но мы перезапустили сервер, то я буду искать в базе данных то, что было последним сохраненным значением для этой машины (поскольку мы также сохраняем это значение в db каждые несколько минут), а затем я передаст это значение до
setClientId
.
И после этого, когда моя программа будет запущена (после инициализации), она будет продолжать использовать метод getClientId
, чтобы дать мне уникальный уникальный идентификатор clientId.
Это правильный способ создания уникального идентификатора для моей машины, который будет uint32_t
для программы на C++? Я также уверен, что если значение достигнет Integer.MAX_VALUE
, установите его на 0 и начните заново. Должен ли я это делать? Или я могу принять отрицательные значения для этого uint32_t
?
В принципе, я хочу создать уникальный номер для моей машины, который всегда должен соответствовать uint32_t
. Если машина является новой машиной, мы можем начать с номера 0 (bcoz, когда мы посмотрим на значение для этой машины, db, не будет никакого значения, поэтому мы начнем с 0), но если машина уже запускала этот код до , затем начните с того, что было последним сохраненным значением в базе данных.
Целые числа Java подписаны, если вы хотите полный диапазон, вы также должны принимать отрицательные значения. –
Значит, 'uint32_t' сможет понять отрицательные целые значения? Простите мое невежество для C++ здесь. – john
Это будет проблемой только в том случае, если вы ожидаете генерировать более 2,147,483,647 уникальных идентификаторов. Но если вы сериализуете подписанный Java 'int' (который может быть отрицательным) в виде четырех байтов и десериализуйте эти 4 байта в вашей программе на C++ как' uint32_t', программа C++ увидит отрицательные целые числа Java как целые числа в диапазоне 2147483648 4294967295. – ajb