Как получить уникальное значение в Java, которое соответствует uint32_t?

Я должен сгенерировать уникальный номер в Java (для моей машины, на которой выполняется код), чтобы в C ++ он мог соответствовать uint32_t, В целом, другие программы на C ++ должны быть в состоянии правильно прочитать этот уникальный номер, как uint32_t, Я посылаю эту информацию в байтовом массиве, который другая программа C ++ десериализует, чтобы получить этот номер. Я не могу изменить тип данных для этого числа в программе C ++ на данный момент.

  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 метод.
  • Если на этой машине уже выполнялся код, но мы перезапустили сервер, я посмотрю в базе данных, какое было последнее сохраненное значение для этой машины (поскольку мы также сохраняем это значение в дБ каждые несколько минут), а затем я передам это значение для setClientId метод.

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

Это правильный способ создания уникального идентификатора для моей машины, который будет uint32_t для программы на C ++? Я также уверен, что если значение достигает Integer.MAX_VALUE затем установите его на 0 и начните снова. Должен ли я сделать это? Или я могу принять отрицательные значения для этого uint32_t?

По сути, я хочу сгенерировать уникальный номер для моей машины, который всегда должен соответствовать uint32_t, Если машина — новая машина, мы можем начать с числа 0 (bcoz, когда мы ищем значение для этой машины, дБ, никакого значения не будет, поэтому мы начнем с 0), но если машина уже выполняла этот код раньше , затем начните с того, что было последним сохраненным значением в базе данных.

1

Решение

Должен ли я сделать это? Или я могу принять и отрицательные значения для этого uint32_t?

Нет, вам не нужно, и вы также можете принимать отрицательные значения. Если вы передаете целое число Java в C ++ побитно, то unit32_t в C ++ будет продолжать увеличиваться, даже если переменная Java превышает максимальное значение и становится отрицательной. Это хорошо в целых числах со знаком 2, которые Java использует для представления интегральных значений.

Вот 4-битный пример, иллюстрирующий происходящее:

Bits  Unsigned  Signed
0000         0       0
0001         1       1
0010         2       2
0011         3       3
0100         4       4
0101         5       5
0110         6       6
0111         7       7
1000         8      -8
1001         9      -7
1010        10      -6
1011        11      -5
1100        12      -4
1101        13      -3
1110        14      -2
1111        15      -1

Также посмотрите этот ответ: Что происходит, когда вы увеличиваете число до максимального значения.

1

Другие решения

Других решений пока нет …